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>的主要内容,如果未能解决你的问题,请参考以下文章
Java Spark 如何将 JavaPairRDD<HashSet<String>, HashMap<String, Double>> 保存到文件中?