spark数据集到数组的转换

bq3bfh9z  于 2021-05-29  发布在  Spark
关注(0)|答案(2)|浏览(453)

这个问题在这里已经有答案了

groupby之后如何将值聚合到集合中(3个答案)
六个月前关门了。
我有一个数据集如下;col1的值重复多次,col2的值是唯一的。这个原始数据集几乎可以容纳10亿行,所以我不想使用collect或collect\u list,因为它不会扩展到我的用例。
原始数据集:

+---------------------|
|    col1  |    col2  |
+---------------------|
|    AA|    11        |
|    BB|    21        |
|    AA|    12        |
|    AA|    13        |
|    BB|    22        |
|    CC|    33        |
+---------------------|

我想将数据集转换为以下数组格式。newcolumn作为col2的数组。
转换的数据集:

+---------------------|
|col1  |     newColumn|
+---------------------|
|    AA|    [11,12,13]|
|    BB|    [21,22]   |
|    CC|    [33]      |
+---------------------|

我见过这个解决方案,但它使用collect\u list,不会扩展到大数据集。

bpsygsoo

bpsygsoo1#

使用spark的内置函数总是最好的方法。我认为使用collect\u list函数没有问题。只要你有足够的记忆力,这将是最好的方法。优化作业的一种方法是将数据保存为parquet,按列a存储数据并将其保存为表。更好的做法是用一些均匀分布数据的列对其进行分区。
例如,

df_stored = #load your data from csv or parquet or any format'
spark.catalog.setCurrentDatabase(database_name)
df_stored.write.mode("overwrite").format("parquet").partitionBy(part_col).bucketBy(10,"col1").option("path",savepath).saveAsTable(tablename)
df_analysis = spark.table(tablename)
df_aggreg = df_analysis.groupby('col1').agg(F.collect_list(col('col2')))

这将加速聚合并避免大量的洗牌。试试看

polhcujo

polhcujo2#

加载Dataframe
分组依据 col1 骨料 col2 使用 collect_list ```
import org.apache.spark.sql.functions

object GroupToArray {

def main(args: Array[String]): Unit = {

val spark = Constant.getSparkSess

import spark.implicits._

//Load your dataframe
val df = List(("AA", "11"),
  ("BB", "21"),
  ("AA", "12"),
  ("AA", "13"),
  ("BB", "22"),
  ("CC", "33")).toDF("col1","col2")

//Group by 'col1'
df.groupBy("col1")
  //agregate on col2 and combine it to a list
.agg(functions.collect_list("col2").as("newColumn"))
  .show()

}

}

相关问题