在编写RDD的JSON表示时,字符串转换为null

时间:2017-02-07 01:27:59

标签: json apache-spark pyspark apache-spark-sql rdd

我正在尝试编写像

这样的结构的RDD

(int,ListofList,ListofListofList)

像这样的东西

{"user":49807360,"history":[[111206019,null,null,null,123], [111206019,null,null,null,123]],"collection":...}

当我打印这是RDD表格时,我正确地看到了数据。当我使用内置库以JSON格式编写它时,我得到空值代替字符串。

rdd.toDF().toJSON().saveAsTextFile(ouput_file_path)

我用来将RDD序列化为JSON的代码行是

rdd.toDF().write.json(ouput_file_path,"overwrite","gzip")

我也试过

`Time (seconds)           Temp Measured (C)
0.000000000000000000e+00 1.009099999999999966e+02
4.000000000000000000e+00 9.545999999999999375e+01
8.000000000000000000e+00 9.284999999999999432e+01
1.200000000000000000e+01 8.940999999999999659e+01
1.600000000000000000e+01 8.618000000000000682e+01
2.000000000000000000e+01 8.148999999999999488e+01
2.400000000000000000e+01 7.909999999999999432e+01

以上代码在spark版本2.0.0中运行

1 个答案:

答案 0 :(得分:1)

这是因为您使用DataFrame作为中间步骤。 Spark SQL不支持异构数组,因此不匹配推断类型(array<bigint>)的值将被NULL替换。

如果你真的想这样,并支持异构结构,你应该使用tuples,它应该映射到Spark SQL structs,或者不依赖于模式推理,以及明确提供所需的架构:

schema = ...  # type: StructType
spark.createDataFrame(rdd, schema)

与架构(JSON representation)类似于:

{'fields': [{'metadata': {}, 'name': '_1', 'nullable': True, 'type': 'long'},
  {'metadata': {},
   'name': '_2',
   'nullable': True,
   'type': {'containsNull': True,
    'elementType': {'fields': [{'metadata': {},
       'name': '_1',
       'nullable': True,
       'type': 'long'},
      {'metadata': {}, 'name': '_2', 'nullable': True, 'type': 'string'},
      {'metadata': {}, 'name': '_3', 'nullable': True, 'type': 'string'},
      {'metadata': {}, 'name': '_4', 'nullable': True, 'type': 'string'},
      {'metadata': {}, 'name': '_5', 'nullable': True, 'type': 'long'}],
     'type': 'struct'},
    'type': 'array'}},
  {'metadata': {},
   'name': '_3',
   'nullable': True,
   'type': {'fields': [{'metadata': {},
      'name': '_1',
      'nullable': True,
      'type': {'fields': [{'metadata': {},
         'name': '_1',
         'nullable': True,
         'type': 'long'},
        {'metadata': {}, 'name': '_2', 'nullable': True, 'type': 'string'},
        {'metadata': {}, 'name': '_3', 'nullable': True, 'type': 'string'},
        {'metadata': {}, 'name': '_4', 'nullable': True, 'type': 'string'},
        {'metadata': {}, 'name': '_5', 'nullable': True, 'type': 'long'}],
       'type': 'struct'}},
     {'metadata': {}, 'name': '_2', 'nullable': True, 'type': 'long'},
     {'metadata': {}, 'name': '_3', 'nullable': True, 'type': 'string'},
     {'metadata': {}, 'name': '_4', 'nullable': True, 'type': 'string'},
     {'metadata': {}, 'name': '_5', 'nullable': True, 'type': 'string'},
     {'metadata': {}, 'name': '_6', 'nullable': True, 'type': 'long'}],
    'type': 'struct'}},
  {'metadata': {},
   'name': '_4',
   'nullable': True,
   'type': {'containsNull': True,
    'elementType': {'fields': [{'metadata': {},
       'name': '_1',
       'nullable': True,
       'type': 'long'},
      {'metadata': {}, 'name': '_2', 'nullable': True, 'type': 'string'},
      {'metadata': {}, 'name': '_3', 'nullable': True, 'type': 'string'},
      {'metadata': {}, 'name': '_4', 'nullable': True, 'type': 'string'},
      {'metadata': {}, 'name': '_5', 'nullable': True, 'type': 'long'}],
     'type': 'struct'},
    'type': 'array'}}],
 'type': 'struct'}