Spark read.json не учитывает логические значения в python - PullRequest
0 голосов
/ 27 июня 2018

Я пытался выполнить пример преобразования строки JSON в фрейм данных в искре, следуя официальной документации здесь .

Следующий случай работает нормально:

jsonStrings = ['{"name":"Yin","address":{"city":"Columbus","state":true}}']
otherPeopleRDD = sc.parallelize(jsonStrings)
otherPeople = spark.read.json(otherPeopleRDD)
otherPeople.show()

====== OUTPUT =======
+----------------+----+
|         address|name|
+----------------+----+
|[Columbus, true]| Yin|
+----------------+----+

root
 |-- address: struct (nullable = true)
 |    |-- city: string (nullable = true)
 |    |-- state: boolean (nullable = true)
 |-- name: string (nullable = true)

Но я получаю сообщение об ошибке при попытке передать логическое значение True (как применимо в python):

jsonStrings = ['{"name":"Yin","address":{"city":"Columbus","state":True}}']
otherPeopleRDD = sc.parallelize(jsonStrings)
otherPeople = spark.read.json(otherPeopleRDD)
otherPeople.show()

====== OUTPUT =======
+--------------------+
|     _corrupt_record|
+--------------------+
|{"name":"Yin","ad...|
+--------------------+

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

Чтобы дать некоторый контекст. Я вызываю API REST для получения данных JSON, используя запросы библиотеку в Python. Затем я получаю строку json, вызывающую .json () в ответе. Это дает мне строку json, где логические значения пишутся с заглавной буквы, как в python. (Истина становится Истиной, ложь становится Ложью). Я думаю, что это желаемое поведение, но при передаче этого JSON для зажигания, он жалуется на формат строки JSON, как показано выше.

resp = requests.get(url, params=query_str, cookies=cookie_str)
jsonString = resp.json()

Я прочитал документацию и искал в Интернете, но не нашел ничего, что могло бы помочь. Может кто-нибудь, пожалуйста, помогите мне здесь!

ОБНОВЛЕНИЕ: я нашел одно возможное объяснение. Это может быть из-за кодирования и декодирования JSON, предлагаемых библиотекой json в python. Ссылка Но это все еще не объясняет, почему pyspark не может определить кодировку Python JSON.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Выдает ошибку, поскольку spark не может преобразовать ваши данные в нужный тип данных. Как вы предоставляете T в шапках. При чтении Jain в Python, пожалуйста, преобразуйте значение в маленький регистр true, и оно будет работать как указано. Нет проблем с вашим кодом. Вы можете воссоздать ошибку с любым другим типом данных. В вашем случае искра выводит схему, и она терпит неудачу. Вы можете предоставить схему явно или оставить True в кавычке, чтобы она воспринимала ее как строку.

0 голосов
/ 27 июня 2018

Используйте модуль json:

import json

spark_friendly_json = json.dumps(resp.json())
otherPeopleRDD = sc.parallelize(spark_friendly_json)
otherPeople = spark.read.json(otherPeopleRDD)
...