为Spark Rows定义新架构

时间:2016-04-14 17:06:40

标签: java apache-spark rdd spark-dataframe

我有一个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调用者中的每一列之外,我还有哪些选项?

1 个答案:

答案 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]