【问题标题】:Spark dataframe requires json file as one object in one line?Spark数据框需要json文件作为一行中的一个对象?
【发布时间】:2018-10-24 02:10:43
【问题描述】:

我是 spark 新手,并试图使用 spark 来读取这样的 json 文件。在 ubuntu18.04、java1.8 上使用 spark 2.3 和 scala 2.11:

猫我的.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

我想知道为什么会这样?没有双 [] 的非标准 json 文件可以工作(一个对象一行),但更标准化的格式化 json 将是“损坏记录”?

【问题讨论】:

标签: json scala apache-spark record corrupt


【解决方案1】:

来自official Document

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

Spark SQL 可以自动推断 JSON 数据集的架构,并 将其作为数据集 [Row] 加载。这种转换可以使用 数据集 [String] 或 JSON 文件上的 SparkSession.read.json()。 请注意,作为 json 文件提供的文件不是典型的 JSON 文件。每行必须包含一个单独的、自包含的有效 JSON 对象。有关更多信息,请参阅 JSON Lines 文本格式, 也称为换行符分隔的 JSON。对于常规的多行 JSON 文件,将 multiLine 选项设置为 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2021-03-17
    • 1970-01-01
    • 2016-06-07
    • 2012-10-25
    相关资源
    最近更新 更多