java - 连接 2 个 Spark 数据帧,以列表形式获取结果

标签 java apache-spark apache-spark-sql

我正在尝试连接 2 个数据帧,但我希望将结果作为左侧数据帧(示例中的 cDf)的列中右侧数据帧(下例中的 dDf)的行列表。

我让它只适用于一列,但添加更多列时遇到问题

    Seq<String> joinColumns = new Set2<>("c1", "c2").toSeq();
    Dataset<Row> allDf = cDf.join(dDf, joinColumns, "inner");
    allDf.printSchema();
    allDf.show();

    Dataset<Row> aggDf = allDf
            .groupBy(cDf.col("c1"), cDf.col("c2"))
            .agg(collect_list(col("c50")));
    aggDf.show();

输出:

+--------+-------+---------------------------+
|c1      |c2     |collect_list(c50)          |
+--------+-------+---------------------------+
|    3744|1160242|         [6, 5, 4, 3, 2, 1]|
|    3739|1150097|                        [1]|
|    3780|1159902|            [5, 4, 3, 2, 1]|
|     132|1200743|               [4, 3, 2, 1]|
|    3778|1183204|                        [1]|
|    3766|1132709|                        [1]|
|    3835|1146169|                        [1]|
+--------+-------+---------------------------+

另外,有没有办法做这样的事情:

    Dataset<Row> aggDf = allDf
            .groupBy(cDf.col("*"))
            .agg(collect_list(col("c50")));

最佳答案

对于问题的第二部分,您可以这样做:

    String[] fields = cDf.columns();
    Column[] columns = new Column[fields.length];
    for (int i = 0; i < fields.length; i++) {
        columns[i] = cDf.col(fields[i]);
    }
    Dataset<Row> sDf = allDf.groupBy(columns).agg(...);

关于java - 连接 2 个 Spark 数据帧,以列表形式获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45843716/

相关文章:

java - 框架退出操作Java

java - 如何提供不同插件采用不同参数的插件模型

java - 如何在对话框中创建动态布局

java - 在使用 hibernate 和 struts 检索数据时,控制台中只会打印对象的地址

csv - 如何在数据框中指定缺失值

python - Python的构建过程工具

java - 如何使用 Java API 将文本文件、图像存储到 Apache Spark 中?

python - 在pyspark SQL DataFrame中乘以稀疏向量行

scala - 如何在不重新分区和 copyMerge 的情况下合并 spark 结果文件?

scala - Spark如何处理涉及JDBC数据源的故障场景?