2016-10-24 6 views
4

Я пытаюсь прочитать Json-файл, используя Spark v2.0.0. В случае простого кода данных работает очень хорошо. В случае небольших битовых данных, когда я печатаю df.show(), данные не отображаются корректно.Чтение файла Json с использованием Apache Spark

вот мой код:

SparkSession session = SparkSession.builder().master("local").appName("jsonreader").getOrCreate(); 
Dataset<Row> list = session.read().json("/Users/hadoop/Desktop/sample.json"); 
list.show(); 

Вот мой пример данных:

{ 
    "glossary": { 
     "title": "example glossary", 
     "GlossDiv": { 
      "title": "S", 
      "GlossList": { 
       "GlossEntry": { 
        "ID": "SGML", 
        "SortAs": "SGML", 
        "GlossTerm": "Standard Generalized Markup Language", 
        "Acronym": "SGML", 
        "Abbrev": "ISO 8879:1986", 
        "GlossDef": { 
         "para": "A meta-markup language, used to create markup languages such as DocBook.", 
         "GlossSeeAlso": ["GML", "XML"] 
        }, 
        "GlossSee": "markup" 
       } 
      } 
     } 
    } 
} 

И мой выход, как:

+--------------------+ 
|  _corrupt_record| 
+--------------------+ 
|     {| 
|  "glossary": {| 
|  "title": ...| 
|   "GlossDiv": {| 
|   "titl...| 
|    "GlossList": {| 
|    "...| 
|     ...| 
|     "SortAs": "S...| 
|     "GlossTerm":...| 
|     "Acronym": "...| 
|     "Abbrev": "I...| 
|     "GlossDef": {| 
|     ...| 
|      "GlossSeeAl...| 
|     ...| 
|     "GlossSee": ...| 
|     }| 
|     }| 
|     }| 
+--------------------+ 
only showing top 20 rows 

ответ

5

Вам нужно будет форматировать JSON в одна строка, если вам нужно прочитать этот JSON. Это многострочный JSON, и, следовательно, не читается и загружается должным образом (One Object one Row)

Цитируя JSON API:

загружает JSON-файл (один объект в каждой строке), и возвращает результат в виде DataFrame.

{"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}} 

Я просто попытался его на раковине, он должен работать с кодом, а так же (у меня был тот же самый испорченный ошибка записи, когда я прочитал многострочный JSON)

scala> val df = spark.read.json("C:/DevelopmentTools/data.json") 
df: org.apache.spark.sql.DataFrame = [glossary: struct<GlossDiv: struct<GlossList: struct<GlossEntry: struct<Abbrev: string, Acronym: string ... 5 more fields>>, title: string>, title: string>] 

scala> 

изменения:

Вы можете получить значения из этого кадра данных с использованием каких-либо действий, например

scala> df.select(df("glossary.GlossDiv.GlossList.GlossEntry.GlossTerm")).show() 
+--------------------+ 
|   GlossTerm| 
+--------------------+ 
|Standard Generali...| 
+--------------------+ 


scala> 

Вы должны быть в состоянии сделать это из вашего кода, а

+0

Спасибо за ваш ответ .. когда я попробовал, я получил это как вывод. + -------------------- + | глоссарий | + -------------------- + | [[[[ISO 8879: 1986 ... | + -------------------- + – user6325753

+0

Ожидается. Добавлено примерное действие, чтобы показать оценку/обработку –

3

Просто убедитесь, что ваш JSON в одной строке вы читаете вложенную JSON так, если вы уже сделали это, вы успешно загрузили JSON, которые вы выводите его в неправильном его вложенным JSON, так что вы не можете сразу показать, как если вы хотите титульные данные GlossDiv вы можете показать, как следовать

SparkSession session = SparkSession.builder().master("local").appName("jsonreader").getOrCreate(); 
Dataset<Row> list = session.read().json("/Users/hadoop/Desktop/sample.json"); 
list.select("glossary.GlossDiv.title") .show 
0

Try:

session.read().json(session.sparkContext.wholeTextFiles("...")); 
0

Эта нить старичок, я хочу просто уточнить что предложил @ user6022341. В итоге я использовал один из своих проектов:

Для обработки многострочного json-файла преобразование wholeTextFiles (String path) является единственным решением в искровом случае, если файл является одним большим json-объектом. Это преобразование будет загружать весь файл в виде строки. Итак, если в каталоге hdfs: // a-hdfs-path у вас было два файла: part-00000 и part-00001. Вызов sparkContext.wholeTextFiles ("hdfs: // a-hdfs-path") приведет к тому, что Spark вернет JavaPairRDD, который имеет ключ как имя файла и значение в качестве содержимого файла. Это не может быть лучшим решением и может поразить производительность для больших файлов.

Но если многострочный json-файл имел несколько объектов json, разделенных на несколько строк, то вы, вероятно, могли бы использовать hasoop.Configuration, показан пример кода кода here. Я сам этого не проверял.

Если вы должны были прочитать файл многострочного CSV, вы можете сделать это с искрой 2,2

spark.read.csv(file, multiLine=True)

https://issues.apache.org/jira/browse/SPARK-19610

https://issues.apache.org/jira/browse/SPARK-20980

Надеется, что это помогает другим людям в поиски подобной информации ,

 Смежные вопросы

  • Нет связанных вопросов^_^