Spark DataFrame需要将json文件作为一行中的一个对象吗? [英] Spark dataframe requires json file as one object in one line?

查看:17
本文介绍了Spark DataFrame需要将json文件作为一行中的一个对象吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Spark的新手,正在尝试使用Spark来读取这样的json文件。在ubuntu18.04、java1.8上使用Spark 2.3和Scala 2.11:

cat my.json:

{ "Name":"A", "No_Of_Emp":1, "No_Of_Supervisors":2}
{ "Name":"B", "No_Of_Emp":2, "No_Of_Supervisors":3}
{ "Name":"C", "No_Of_Emp":13,"No_Of_Supervisors":6}

我的Scala代码是:

val dir = System.getProperty("user.dir")
val conf = new SparkConf().setAppName("spark sql")
.set("spark.sql.warehouse.dir", dir)
.setMaster("local[4]");
val spark = SparkSession.builder().config(conf).getOrCreate()
val df = spark.read.json("my.json")
df.show()
df.printSchema()
df.select("Name").show()

好的,一切都好。但如果我将json文件更改为多行标准json格式:

[
    {
      "Name": "A",
      "No_Of_Emp": 1,
      "No_Of_Supervisors": 2
    },
    {
      "Name": "B",
      "No_Of_Emp": 2,
      "No_Of_Supervisors": 3
    },
    {
      "Name": "C",
      "No_Of_Emp": 13,
      "No_Of_Supervisors": 6
    }
]

然后程序将报告错误:

+--------------------+
|     _corrupt_record|
+--------------------+
|                   [|
|                   {|
|        "Name": "A",|
|      "No_Of_Emp"...|
|      "No_Of_Supe...|
|                  },|
|                   {|
|        "Name": "B",|
|      "No_Of_Emp"...|
|      "No_Of_Supe...|
|                  },|
|                   {|
|        "Name": "C",|
|      "No_Of_Emp"...|
|      "No_Of_Supe...|
|                   }|
|                   ]|
+--------------------+

root
 |-- _corrupt_record: string (nullable = true)

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`Name`' given input columns: [_corrupt_record];;
'Project ['Name]
+- Relation[_corrupt_record#0] json

我想知道为什么会发生这种情况?不带Double[]的非标准json文件可以工作(一个对象占一行),但格式更标准化的json文件将是"损坏的记录"?

推荐答案

来自official Document

我们可以获得有关您的问题的一些信息

Spark SQL可以自动推断JSON数据集的模式,并 将其作为数据集[行]加载。此转换可以使用以下命令完成 数据集[字符串]或JSON文件上的SparkSession.read.json()。 请注意,作为json文件提供的文件不是典型的 JSON文件。每行必须包含单独的、自包含的有效 JSON对象。详见JSON行文本格式, 也称为换行符分隔的JSON。对于常规的多行JSON 文件中,将多行选项设置为True。

因此,如果要使用数据多行运行它,请将multiLine选项设置为true

下面是示例:

val conf = new SparkConf().setAppName("spark sql")
  .set("spark.sql.warehouse.dir", dir)
  .setMaster("local[*]")

val spark = SparkSession.builder().config(conf).getOrCreate()

val df = spark.read.option("multiLine", true).json("my.json")
df.show()
df.printSchema()
df.select("Name").show()

这篇关于Spark DataFrame需要将json文件作为一行中的一个对象吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆