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

ffdz8vbo  于 2023-04-19  发布在  Java
关注(0)|答案(3)|浏览(153)

我使用SPARK Java API读取文本文件,将其转换为JSON,然后对其应用模式。模式可以根据数据库中的Map表而变化,这就是为什么我需要首先将文件转换为JSON,以便模式Map不必按列顺序。下面是我所做的:

// 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字符串转换为整数。然而,我试图将data变量定义为Row Dataset而不是String Dataset,但出现了Incompatible Types错误。我不确定解决方法是什么或真实的的问题是什么。

c3frrgcw

c3frrgcw1#

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

hgncfbus

hgncfbus2#

我认为这是由于JSON和定义的模式中的数据类型不匹配而发生的。例如,在JSON中,属性具有整数的“age”,但模式定义了String类型的“age”。由于这种不匹配,所有数据都为null。

qzwqbdag

qzwqbdag3#

不知道这是否有帮助,但是在spark中阅读JSON文件时,请确保schema和JSON文件中的列名完全匹配。否则将显示Null值。

相关问题