Изменить схему dataframe в pySpark - PullRequest
0 голосов
/ 18 января 2020

Мне нужно изменить схему кадра данных, вызвав схему из файла JSON.

df1.show()
+---+---+
|a  |b  |
+---+---+
|c  |2  |
+---+---+
printSchema:
  a: string (nullable - true)
  b: long (nullable - true)

Новая схема в файле json выглядит следующим образом:

{ "schema": ["a StringType() False", "b IntegerType() False"] }

Теперь я вызываю файл json и передаю новую схему следующим образом:

with open('/path/app.json') as f:
   config = json.load(f)

new_schema = [StructField(e.split(' ')[0], e.split(' ')[1], e.split(' ')[2]) for e in config]
new_df = spark.createDataFrame(df1.rdd, StructType(new_schema))

Я получаю сообщение об ошибке вроде:

Failed to convert JSON string \'{"metadata": {}, "name": "a", "nullable": "false" .... to a field.

Как я могу это исправить ошибка?

1 Ответ

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

В вашем коде есть две ошибки, сначала

, с этим утверждением -

new_schema = [StructField(e.split(' ')[0], e.split(' ')[1], e.split(' ')[2]) for e in config]

здесь вы должны получить доступ к части значения атрибута json schema, как -

new_schema = [StructField(e.split(' ')[0], eval(e.split(' ')[1]), 
              e.split(' ')[2]) for e in config["schema"]]

Во-вторых, тип внутри StructField должен оцениваться как код, иначе вы просто создаете структурное поле с (строка, строка, строка) вместо (name, dataType, nullable)

, чтобы исправить для этого используйте функцию eval() для e.split(' ')[1] и конвертируйте e.split(' ')[1] в логическое значение -

from pyspark.sql.types import *
new_schema = [StructField(e.split(' ')[0], 
eval(e.split(' ')[1]), 
bool(e.split(' ')[2])) for e in config["schema"]] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...