Как создать фрейм данных Spark- SQL из файла JSON, в котором указаны данные и схема - PullRequest
0 голосов
/ 05 августа 2020
conf = SparkConf().setAppName("PySpark").setMaster("local")
sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)

file = sqlContext.read.json(json_file_path)
file.show()

Выводы:

+--------------------+--------------------+
|                data|              schema|
+--------------------+--------------------+
|[[The battery is ...|[[[index, integer...|
+--------------------+--------------------+

Как мне извлечь данные, используя мою собственную созданную схему. Мой код схемы:

from pyspark.sql.types import ArrayType, StructField, StructType, StringType, IntegerType
schema = StructType([
    StructField('index', IntegerType(), True),
    StructField('content', StringType(), True),
    StructField('label', IntegerType(), True),
    StructField('label_1', StringType(), True ),
    StructField('label_2', StringType(), True ),
    StructField('label_3', IntegerType(), True ),
    StructField('label_4', IntegerType(), True )])

Я пробовал:

file.withColumn("data", from_json("data", schema))\
    .show()

Но я получаю следующую ошибку:

 cannot resolve 'from_json(`data`)' due to data type mismatch: argument 1 requires string type, however, '`data`' is of array<struct<content:string,index:bigint,label:bigint,label_1:string,label_2:string,label_3:double,label_4:timestamp>> type.;;

1 Ответ

0 голосов
/ 05 августа 2020

Метод read уже распознал схему сзади.

Попробуйте запустить file.printSchema(), и он должен показать более-менее нужную вам схему.

Способ распаковки data должен запускаться:

file = file.select(explode("data").as("exploded_data"))

Если хотите, вы можете перейти на следующий уровень с помощью:

file.select(file.col("exploded_data.*"))

Это сгладит схему.

Отказ от ответственности: это код scala, python может потребоваться небольшая корректировка

...