将嵌套的RDD转换为数据框时获取空值

时间:2019-06-01 00:41:10

标签: scala apache-spark apache-spark-sql java-pair-rdd

我有一个序列文件,已使用具有正确类格式的newAPIHadoopFile将其转换为RDD。

使用序列读取器将序列文件转换为字符串,其格式为:

[ key1, key2, key3 ] :
(
 val1,
 val2,
 { val3:
  [
   {id:"nested_val"},
   {id:"nested_val"},
   {id:"nested_val"},
   {id:"nested_val"}
  ],
 val4: "as",
 val5: "df",
 val6: 4,
 }
)

我的最终目标是能够将此RDD转换为数据帧并进行一些处理。

在这里,我尝试访问nested_values,但得到null:

val rdd_mapped = rdd
.map({case(keys, value) => (keys.get(0).toString,value.get("val3")) })
.map({case(key_val, value_val) => Row(key_val, value_val) })

val schema = StructType(StructField("key_val", StringType, true) ::
                        StructField("value_val",StructType(
                                                StructField("nested_val",
                                                StringType, true) :: Nil))
                        :: Nil)

val df = spark.createDataFrame(rdd_mapped, schema)
df.show(2)

如果不尝试嵌套,则尝试打印val4 / val5即可。似乎我没有正确映射嵌套的值。

使用上面的代码,这就是我得到的:

+------------+------------+
|key_val     |value_val   |
+------------+------------+
|key1        |        null|         
+------------+------------+

0 个答案:

没有答案