gpt4 book ai didi

java - 在 Spark 中对 RDD 执行分组并将每个组写入单独的 Parquet 文件

转载 作者:行者123 更新时间:2023-12-02 08:31:11 35 4
gpt4 key购买 nike

我的内存中有一个 RDD。我想使用一些任意函数对 RDD 进行分组,然后将每个单独的组写为单独的 Parquet 文件。

例如,如果我的 RDD 由以下形式的 JSON 字符串组成:

{"type":"finish","resolution":"success","csr_id": 214}
{"type":"create","resolution":"failure","csr_id": 321}
{"type":"action","resolution":"success","csr_id": 262}

我想按“type”属性对 JSON 字符串进行分组,并将具有相同“type”的每组字符串写入同一个 Parquet 文件中。

我可以看到 DataFrame API 允许按如下方式写出 Parquet 文件(例如,如果 RDD 由 JSON 字符串组成):

final JavaRDD<String> rdd = ...
final SQLContext sqlContext = SQLContext.getOrCreate(rdd.context());
final DataFrame dataFrame = sqlContext.read().json(rdd);
dataFrame.write().parquet(location);

这意味着整个 DataFrame 都会写入 Parquet 文件,因此 Parquet 文件将包含“type”属性具有不同值的记录。

Dataframe API 还提供了 groupBy 函数:

final GroupedData groupedData = dataFrame.groupBy(this::myFunction);

但是 GroupedData API 似乎不提供任何将每个组写入单个文件的功能。

有什么想法吗?

最佳答案

您无法写入GroupedData,但可以在写入时对数据进行分区:

dataFrame.write.partitionBy("type").format("parquet").save("/tmp/foo")

每种类型都将以 ${column}=${value} 格式写入其自己的目录。这些可以单独加载:

sqlContext.read.parquet("/tmp/foo/type=action").show
// +------+----------+
// |csr_id|resolution|
// +------+----------+
// | 262| success|
// +------+----------+

关于java - 在 Spark 中对 RDD 执行分组并将每个组写入单独的 Parquet 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35444971/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com