簡體   English   中英

Java - Spark SQL DataFrame映射函數不起作用

[英]Java - Spark SQL DataFrame map function is not working

在Spark SQL中,當我嘗試在DataFrame上使用map函數時,我遇到了錯誤。

DataFrame類型中的方法映射(Function1,ClassTag)不適用於參數(new Function(){})

我也在關注spark 1.3文檔。 https://spark.apache.org/docs/latest/sql-programming-guide.html#inferring-the-schema-using-reflection有任何解決方案嗎?

這是我的測試代碼。

   // SQL can be run over RDDs that have been registered as tables.
DataFrame teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19");

List<String> teenagerNames = teenagers.map(
            new Function<Row, String>() {
          public String call(Row row) {
            return "Name: " + row.getString(0);
          }
        }).collect();

將其更改為:

Java 6&7

List<String> teenagerNames = teenagers.javaRDD().map(
    new Function<Row, String>() {
    public String call(Row row) {
        return "Name: " + row.getString(0);
    }
}).collect();

Java 8

List<String> t2 = teenagers.javaRDD().map(
    row -> "Name: " + row.getString(0)
).collect();

一旦調用javaRDD(),它就像任何其他RDD映射函數一樣工作。

這適用於Spark 1.3.0及更高版本。

無需轉換為RDD,它可以延遲執行,如下所示

`public static void mapMethod(){//從文件中讀取數據,文件位於類路徑中。 數據集df = sparkSession.read()。json(“file1.json”);

// Prior to java 1.8 
Encoder<String> encoder = Encoders.STRING();
    List<String> rowsList = df.map((new MapFunction<Row, String>() {
        private static final long serialVersionUID = 1L;

        @Override
        public String call(Row row) throws Exception {
            return "string:>" + row.getString(0).toString() + "<";
        }
    }), encoder).collectAsList();

// from java 1.8 onwards
List<String> rowsList1 = df.map((row -> "string >" + row.getString(0) + "<" ), encoder).collectAsList();
System.out.println(">>> " + rowsList);
System.out.println(">>> " + rowsList1);

}`

你的pom中是否有正確的依賴集。 設置此並嘗試

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.10</artifactId>
        <version>1.3.1</version>
    </dependency>

試試這個:

// SQL can be run over RDDs that have been registered as tables.
DataFrame teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19");

List<String> teenagerNames = teenagers.toJavaRDD().map(
        new Function<Row, String>() {
      public String call(Row row) {
        return "Name: " + row.getString(0);
      }
    }).collect();

你必須將你的DataFrame轉換為javaRDD

檢查您是否使用了正確的導入

Row(import org.apache.spark.sql.Row)刪除與Row.otherwise相關的所有其他導入,你的語法是正確的

請檢查輸入文件的數據和數據幀sql查詢我面臨的同樣的事情,當我回顧數據,因此它與我的查詢不匹配。 所以你可能遇到同樣的問題。 toJavaRDD和JavaRDD都在工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM