Spark dataframe требует json файл как один объект в одной строке? - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в spark и пытаюсь использовать spark для чтения json-файла следующим образом.Используя spark 2.3 и scala 2.11 на ubuntu18.04, java1.8:

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

Я хочу знать, почему это происходит?Не будет работать ни один стандартный файл json без double [] (один объект на одну строку), но более стандартизированный отформатированный json будет «поврежденной записью»?

1 Ответ

0 голосов
/ 24 октября 2018

Из официального документа

мы можем получить некоторую информацию о вашем вопросе

**

Spark SQL может автоматически вывестисхема набора данных JSON и загрузка его в виде набора данных [Row].Это преобразование можно выполнить с помощью SparkSession.read.json () в наборе данных [String] или в файле JSON.Обратите внимание, что файл, который предлагается в виде файла JSON, не является типичным файлом JSON.Каждая строка должна содержать отдельный, автономный действительный объект JSON.Для получения дополнительной информации см. Текстовый формат JSON Lines, также называемый 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()
...