Spark Java读取JSON文件生成视图出现首尾空行问题求助
问题原因分析
你遇到的首尾全null行问题,根源出在JSON文件的格式不符合Spark默认的读取规则,之前尝试的multiline=true没生效,也是因为文件格式本身存在错误。
Spark默认读取的是JSON Lines格式(又称换行分隔JSON),要求每行是一个独立的合法JSON对象,不需要额外的外层包裹符号。但你的JSON文件外层多了一对{}:
{ {"id" : "1201", "name" : "satish", "age" : "25"} {"id" : "1202", "name" : "krishna", "age" : "28"} }
这两个外层的大括号会被Spark分别解析成两个没有任何键值对的空JSON对象,自然就输出了首尾两行全null的结果。
解决办法
你可以选择以下两种方案中的任意一种来解决:
方案1:改成标准JSON Lines格式
直接去掉文件外层的{},让每个JSON对象单独占一行,最终文件内容如下:
{"id" : "1201", "name" : "satish", "age" : "25"} {"id" : "1202", "name" : "krishna", "age" : "28"}
这种格式下,你不需要修改任何代码,直接运行原来的Spark代码就能得到正确结果:
+----+-------+----+ | id| name| age| +----+-------+----+ |1201| satish| 25| |1202|krishna| 28| +----+-------+----+
方案2:改成标准JSON数组格式并开启multiline选项
如果更习惯用数组格式存储JSON,可以把文件改成标准的JSON数组(注意元素之间要加逗号,用[]包裹):
[ {"id" : "1201", "name" : "satish", "age" : "25"}, {"id" : "1202", "name" : "krishna", "age" : "28"} ]
这时候需要在Spark读取时开启multiline=true,让Spark能解析跨多行的JSON数组,修改后的代码如下:
class Something { public void DoSomething() { SparkSession session = SparkSession.builder().appName("jsonreader") .master("local[4]").getOrCreate(); Dataset<Row> jsondataset = session.read() .option("multiline", true) // 开启多行JSON解析 .json("G:\\data\\employee.json"); jsondataset.select("id","name","age").show(); } }
运行后也能正确获取到两行有效数据,不会出现null行。
内容的提问来源于stack exchange,提问作者Manoj Kumar
相关产品推荐
相关产品推荐

