我有一个DataFrame,其中一个列包含一个JSON字符串。到目前为止,我已根据Function
方法JavaRDD.map
的要求实施了Function<Row,Row>()
接口。在这个函数中,我正在解析JSON,并创建一个新行,其附加列来自JSON中的值。例如:
原帖:
+------+-----------------------------------+
| id | json |
+------+-----------------------------------+
| 1 | {"id":"abcd", "name":"dmux",...} |
+------------------------------------------+
申请我的职能后:
+------+----------+-----------+
| id | json_id | json_name |
+------+----------+-----------+
| 1 | abcd | dmux |
+-----------------+-----------+
尝试从返回的JavaRDD创建新的DataFrame时遇到了麻烦。现在我有了这些新行,我需要创建一个模式。模式高度依赖于JSON的结构,所以我试图找出一种从函数和Row
对象传回模式数据的方法。我不能使用broadcast
变量,因为SparkContext没有传递给函数。
除了循环调用Function
调用者中的每一列之外,我还有哪些选项?
答案 0 :(得分:2)
您可以创建StructType
。这是Scala
,但它的工作方式相同:
val newSchema = StructType(Array(
StructField("id", LongType, false),
StructField("json_id", StringType, false),
StructField("json_name", StringType, false)
))
val newDf = sqlContext.createDataFrame(rdd, newSchema)
顺便说一下,您需要确保rdd
类型为RDD[Row]
。