我是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将是“损坏的记录”?
答案 0 :(得分:1)
我们可以获取有关您的问题的一些信息
**
Spark SQL可以自动推断JSON数据集的架构,并且 将其加载为数据集[行]。可以使用以下方式完成此转换 数据集[String]或JSON文件上的SparkSession.read.json()。 请注意,以json文件形式提供的文件不是典型的 JSON文件。每行必须包含一个单独的,独立的有效 JSON对象。有关更多信息,请参见JSON行文本格式, 也称为以换行符分隔的JSON。对于常规的多行JSON 文件,将multiLine选项设置为true。
**
因此,如果要使用数据multiLine来运行它,请将multiLine选项设置为true。
这是示例
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.option("multiLine", true).json("my.json")
df.show()
df.printSchema()
df.select("Name").show()