尝试将模式应用于JSON数据时,SPARK数据框返回null

时间:2019-10-12 00:16:14

标签: java json dataframe apache-spark schema

我正在使用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字符串转换为整数。但是,我尝试将数据变量定义为行数据集而不是字符串数据集,但是出现“不兼容类型”错误。我不确定解决方法是什么或真正的问题是什么。

2 个答案:

答案 0 :(得分:1)

解决了问题:

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

答案 1 :(得分:0)

我认为这是由于 JSON 和定义的架构中的数据类型不匹配而发生的。 例如,在 JSON 属性中,“年龄”为整数,但架构已将“年龄”定义为字符串类型。由于这种不匹配,所有数据都为空。