我不能让Spark读取json
(或csv)作为Dataset
案例类Option[_]
字段其中并非所有字段都在源中定义。Spark默认空列DataSet
这是一个有点神秘,但让我们说我有一个名为的情况下,类CustomData
考虑下面的JSON文件(customA.json
):
{"id":123, "colA": "x", "colB": "z"}
{"id":456, "colA": "y"}
{"id":789, "colB": "a"}
以下代码:
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder()
.master("local[2]")
.appName("test")
.getOrCreate()
import spark.implicits._
case class CustomData(id: BigInt, colA: Option[String], colB: Option[String])
org.apache.spark.sql.catalyst.encoders.OuterScopes.addOuterScope(this)
val ds = spark
.read
.option("mode", "PERMISSIVE")
.json("src/main/resources/customA.json")
.as[CustomData]
.show()
输出与预期的一样 - :
+----+----+---+
|colA|colB| id|
+----+----+---+
| x| z|123|
| y|null|456|
|null| a|789|
+----+----+---+
尽管并非所有的列都是定义的。 但是,如果我想使用相同的代码读取其中的一列出现无处一个文件,我不能做到这一点:
对于其他JSON文件(customB.json
):
{"id":321, "colA": "x"}
{"id":654, "colA": "y"}
{"id":987}
和附加代码:
val ds2 = spark
.read
.option("mode", "PERMISSIVE")
.json("src/main/resources/customB.json")
.as[CustomData]
.show()
的输出是一个错误:
org.apache.spark.sql.AnalysisExcept ion:无法解析'colB
'给定的输入列:[colA,id];
这是有道理的,但我很想重复使用这两个文件相同的案例类。特别是如果我不知道在摄取它之前甚至会在json文件中出现colB
。
当然,我可以检查,但有没有办法将不存在的列转换为null
(与customA.json
一样)。将readmode设置为Permissive
似乎没有改变任何内容。
我错过了什么吗?