【问题标题】:SPARK dataframe returning null when trying to apply schema to JSON data尝试将模式应用于 JSON 数据时,SPARK 数据帧返回 null
【发布时间】:2020-02-09 11:38:42
【问题描述】:

我正在使用 SPARK Java API 读取文本文件,将其转换为 JSON,然后对其应用架构。架构可以根据数据库中的映射表而有所不同,这就是为什么我需要首先将文件转换为 JSON,这样架构映射就不必按列顺序排列。这是我所做的:

// Defined the schema (basic representation)
StructType myschema = new StructType().add("a", DataTypes.StringType, true)
                                      .add("b", DataTypes.StringType, true)
                                      .add("x", DataTypes.StringType, true)
                                      .add("y", DataTypes.IntegerType, true)
                                      .add("z", DataTypes.BooleanType, true);

//Reading a pipe delimited text file as JSON, the file has less columns than myschema
Dataset<String> data = spark.read().option("delimiter","|").option("header","true").csv(myFile).toJSON();

上表返回如下内容:

data.show(false);

|value|
+----------------------------------------+
|      {"x":"name1","z":"true","y":"1234"}|
|      {"x":"name2","z":"false","y":"1445"}|
|      {"x":"name3","z":"true",:y":"1212"}|

当我运行这个时我的问题出现了:

Dataset<Row> data_with_schema = spark.read().schema(myschema).json(data);

因为我的结果变成了这样:

data_with_schema.show(false);
|x|y|z|
+-------+-------+-------+
|null  |null  |null  |
|null  |null  |null  |
|null  |null  |null  |

我在 stackoverflow 上读到这可能是因为我试图将 json 字符串转换为整数。但是,我尝试将数据变量定义为行数据集而不是字符串数据集,但出现了不兼容的类型错误。我不确定解决方法是什么或真正的问题是什么。

【问题讨论】:

  • 删除 .schema(myschema) 后会发生什么?
  • 它以表格格式返回 JSON 数据,其中包含正确的数据字段而不是空值。但是,所有数据都是字符串类型,而不是正确的架构。
  • 然后删除提供的模式,并在最后添加一个选择,将 y 转换为整数,将 z 转换为布尔值(如果适合您)

标签: java json dataframe apache-spark schema


【解决方案1】:

我认为这是由于 JSON 和定义的架构中的数据类型不匹配造成的。 例如,在 JSON 中,属性具有整数的“年龄”,但模式定义了字符串类型的“年龄”。由于这种不匹配,所有数据都为空。

【讨论】:

    【解决方案2】:

    找出问题所在:

    如果输入的文件中存在无法应用架构的数据,它将为表中的所有数据返回 Null。例如:“1n”是不可能转换成整数的。如果将 DataTypes.IntegerType 应用于包含“1n”的列,则整个表具有空值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多