Невозможно запросить JSON созданный столбец данных в PySpark - PullRequest
0 голосов
/ 08 января 2020

У меня есть датафрейм, который я сделал из файла json. Схема такая:

>>> df.printSchema()
root
 |-- attributes: struct (nullable = true)
 |    |-- att-a: string (nullable = true)
 |    |-- att-b: string (nullable = true)
 |    |-- att-c: string (nullable = true)
 |    |-- att-d: string (nullable = true)
 |    |-- att-e: string (nullable = true)
 |    |-- att-f: string (nullable = true)
 |    |-- att-g: string (nullable = true)
 |    |-- att-h: string (nullable = true)
 |    |-- att-i: string (nullable = true)
 |    |-- att-j: string (nullable = true)
 |-- customer: string (nullable = true)

Но когда я пытаюсь получить доступ к содержимому столбца "атрибуты", я получаю эту ошибку -

>>> test = spark.sql("select customer, attributes.att-a from df limit 1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/apache-spark/2.4.4/libexec/python/pyspark/sql/session.py", line 767, in sql
    return DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped)
  File "/usr/local/Cellar/apache-spark/2.4.4/libexec/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/usr/local/Cellar/apache-spark/2.4.4/libexec/python/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: u'No such struct field att in att-a, att-b, att-c, att-d, att-e, att-f, att-g, att-h, att-i, att-j; line 1 pos 17'

Если я использую backtick для ссылки на столбец я получаю эту ошибку-

>>> test = spark.sql("select customer, `attributes.att-a` from df limit 1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/apache-spark/2.4.4/libexec/python/pyspark/sql/session.py", line 767, in sql
    return DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped)
  File "/usr/local/Cellar/apache-spark/2.4.4/libexec/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/usr/local/Cellar/apache-spark/2.4.4/libexec/python/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: u"cannot resolve '`attributes.att-a`' given input columns: [df.attributes, df.customer]; line 1 pos 17;\n'GlobalLimit 1\n+- 'LocalLimit 1\n   +- 'Project [customer#7, '`attributes.att-a`]\n      +- SubqueryAlias `df`\n         +- Relation[attributes#6,customer#7] json\n"

В чем может быть причина? Как я могу запросить этот столбец?

1 Ответ

0 голосов
/ 09 января 2020

Как упомянуто в комментариях @blackbishop, попробуйте добавить backtick только для StructField.

test = spark.sql("select customer, attributes.`att-a` from df limit 1")

Для получения дополнительной информации о backtick см. spark java docs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...