Как получить определение схемы из фрейма данных в PySpark?

В PySpark вы можете определить схему и читать источники данных с помощью этой предопределенной схемы, например. грамм.:

Schema = StructType([ StructField("temperature", DoubleType(), True),
                      StructField("temperature_unit", StringType(), True),
                      StructField("humidity", DoubleType(), True),
                      StructField("humidity_unit", StringType(), True),
                      StructField("pressure", DoubleType(), True),
                      StructField("pressure_unit", StringType(), True)
                    ])

Для некоторых источников данных можно вывести схему из источника данных и получить фрейм данных с этим определением схемы.

Можно ли получить определение схемы (в форме, описанной выше) из фрейма данных, где данные были выведены ранее?

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


person Hauke Mallow    schedule 03.02.2019    source источник


Ответы (4)


Да, это возможно. Используйте DataFrame.schema < / a> property

schema

Возвращает схему этого DataFrame как pyspark.sql.types.StructType.

>>> df.schema
StructType(List(StructField(age,IntegerType,true),StructField(name,StringType,true)))

Новое в версии 1.3.

Схема также может быть экспортирована в JSON и импортирована обратно при необходимости.

person Community    schedule 03.02.2019

Вы можете повторно использовать схему для существующего фрейма данных

l = [('Ankita',25,'F'),('Jalfaizy',22,'M'),('saurabh',20,'M'),('Bala',26,None)]
people_rdd=spark.sparkContext.parallelize(l)
schemaPeople = people_rdd.toDF(['name','age','gender'])

schemaPeople.show()

+--------+---+------+
|    name|age|gender|
+--------+---+------+
|  Ankita| 25|     F|
|Jalfaizy| 22|     M|
| saurabh| 20|     M|
|    Bala| 26|  null|
+--------+---+------+

spark.createDataFrame(people_rdd,schemaPeople.schema).show()

+--------+---+------+
|    name|age|gender|
+--------+---+------+
|  Ankita| 25|     F|
|Jalfaizy| 22|     M|
| saurabh| 20|     M|
|    Bala| 26|  null|
+--------+---+------+

Просто используйте df.schema, чтобы получить базовую схему фрейма данных

schemaPeople.schema

StructType(List(StructField(name,StringType,true),StructField(age,LongType,true),StructField(gender,StringType,true)))
person saurabh shashank    schedule 03.02.2019

Приведенный ниже код даст вам хорошо отформатированное определение табличной схемы известного фрейма данных. Очень полезно, когда у вас очень большое количество столбцов и когда редактирование затруднительно. Затем вы можете применить его к новому фрейму данных и отредактировать вручную любые столбцы, которые вам могут понадобиться.

from pyspark.sql.types import StructType

schema = [i for i in df.schema] 

И вот отсюда у вас есть новая схема:

NewSchema = StructType(schema)
person Laenka-Oss    schedule 09.02.2020

Если вы ищете строку DDL из PySpark:

df: DataFrame = spark.read.load('LOCATION')
schema_json = df.schema.json()
ddl = spark.sparkContext._jvm.org.apache.spark.sql.types.DataType.fromJson(schema_json).toDDL()
person Boris    schedule 14.12.2020