【问题标题】:How do I collect a List of Strings from spark DataFrame Column after a GroupBy operation?如何在 GroupBy 操作后从 spark DataFrame Column 收集字符串列表?
【发布时间】:2016-05-21 07:50:58
【问题描述】:

here 描述的解决方案(由 zero323 提供)非常接近我想要的,有两个转折:

  1. 我如何在 Java 中做到这一点?
  2. 如果该列有一个字符串列表而不是单个字符串,并且我想在 GroupBy(某个其他列)之后将所有这些列表收集到一个列表中怎么办?

我正在使用 Spark 1.6 并尝试过使用

org.apache.spark.sql.functions.collect_list(Column col) 如该问题的解决方案中所述,但出现以下错误

线程“主”org.apache.spark.sql.AnalysisException 中的异常:未定义的函数collect_list; 在 org.apache.spark.sql.catalyst.analysis.SimpleFunctionRegistry$$anonfun$2.apply(FunctionRegistry.scala:65) 在 org.apache.spark.sql.catalyst.analysis.SimpleFunctionRegistry$$anonfun$2.apply(FunctionRegistry.scala:65) 在 scala.Option.getOrElse(Option.scala:121)

【问题讨论】:

    标签: java apache-spark apache-spark-sql


    【解决方案1】:

    您看到的错误提示您使用普通的SQLContext 而不是HiveContextcollect_list 是 Hive UDF,因此需要 HiveContext。它也不支持复杂的列,所以唯一的选择是先explode

    import org.apache.spark.api.java.*;
    import org.apache.spark.SparkConf;
    import org.apache.spark.sql.SQLContext;
    import org.apache.spark.sql.hive.HiveContext;
    import java.util.*;
    import org.apache.spark.sql.DataFrame;
    import static org.apache.spark.sql.functions.*;
    
    public class App {
      public static void main(String[] args) {
        JavaSparkContext sc = new JavaSparkContext(new SparkConf());
        SQLContext sqlContext = new HiveContext(sc);
        List<String> data = Arrays.asList(
                "{\"id\": 1, \"vs\": [\"a\", \"b\"]}",
                "{\"id\": 1, \"vs\": [\"c\", \"d\"]}",
                "{\"id\": 2, \"vs\": [\"e\", \"f\"]}",
                "{\"id\": 2, \"vs\": [\"g\", \"h\"]}"
        );
        DataFrame df = sqlContext.read().json(sc.parallelize(data));
        df.withColumn("vs", explode(col("vs")))
               .groupBy(col("id"))
               .agg(collect_list(col("vs")))
               .show();
      }
    }
    

    但它不太可能表现良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-29
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2020-12-13
      • 1970-01-01
      • 2016-09-04
      相关资源
      最近更新 更多