JavaPairRDD 到 SPARK 中的数据集<Row>

Posted

技术标签:

【中文标题】JavaPairRDD 到 SPARK 中的数据集<Row>【英文标题】:JavaPairRDD to Dataset<Row> in SPARK 【发布时间】:2018-06-13 09:47:46 【问题描述】:

我有 JavaPairRDD 格式的数据

JavaPairdRDD<Tuple2<String, Tuple2<String,String>>>

我尝试使用下面的代码

 Encoder<Tuple2<String, Tuple2<String,String>>> encoder2 =
 Encoders.tuple(Encoders.STRING(), Encoders.tuple(Encoders.STRING(),Encoders.STRING()));
 Dataset<Row> userViolationsDetails = spark.createDataset(JavaPairRDD.toRDD(MY_RDD),encoder2).toDF("value1","value2");

但是如何生成具有 3 列的数据集???由于上述代码的输出为我提供了 2 列中的数据。任何指针/建议???

【问题讨论】:

你想要什么扁平化元组?试试toDF("value1","value2","value3") @jojo_Berlini 尝试这样做,但它给出了错误。 这似乎是一个错误 - 元组中的值应该具有区分字段名称。随意创建 Jira 票 感谢 @T.Gawęda 的回复,我已经创建了 Jira 票 issues.apache.org/jira/browse/SPARK-24548 让我们看看何时有人拿起它 【参考方案1】:

尝试运行printSchema - 你会看到,value2 是一个复杂类型。

有了这些信息,你可以写:

Dataset<Row> uvd = userViolationsDetails.selectExpr("value1", "value2._1 as value2", "value2._2 as value3")

value2._1 表示当前“value2”字段中元组的第一个元素。我们将 value2 字段覆盖为只有一个值

请注意,这将在 https://issues.apache.org/jira/browse/SPARK-24548 合并到 master 分支后起作用。目前 Spark 中存在一个错误,元组被转换为具有两个名为 value 的字段的结构体

【讨论】:

感谢您的回复,但是当尝试打印模式时,它给了我以下响应:` root |-- value1: string (nullable = true) |-- value2: struct (nullable = true) | |-- 值:字符串(可为空=真)| |-- value: string (nullable = true) ` 这里 value2 与 value 同名,当试图运行 select: [Dataset].selectExpr("value1", "value2._1 as value2").show();我得到的异常是“异常 :: No such struct field _1 in value, value; line 1 pos 0”。 @Jack 感谢您的回复。可能是笔误,我正在调查中

以上是关于JavaPairRDD 到 SPARK 中的数据集<Row>的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JavaPairRDD 转换为数据集?

如何将数据集转换为 JavaPairRDD?

Java Spark 如何将 JavaPairRDD<HashSet<String>, HashMap<String, Double>> 保存到文件中?

使用 scala 将 JavapairRDD 转换为数据帧

Spark惰性转换执行障碍

通过操作 JavaPairRDD 的值 (Sum) 来转换 JavaPairRDD