【问题标题】:How to get the schema definition from a dataframe in PySpark?如何从 PySpark 中的数据框中获取模式定义?
【发布时间】:2019-06-27 10:02:59
【问题描述】:

在 PySpark 中,您可以定义模式并使用此预定义模式读取数据源,例如。 g.:

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() 将架构打印为树,但我需要重用架构,将其定义如上,因此我可以读取具有此架构的数据源,该架构之前已从另一个数据源推断出。

【问题讨论】:

    标签: apache-spark dataframe pyspark schema azure-databricks


    【解决方案1】:

    是的,这是可能的。使用DataFrame.schemaproperty

    schema

    以 pyspark.sql.types.StructType 形式返回此 DataFrame 的架构。

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

    1.3 版中的新功能。

    如果需要,架构 can be also exported to JSON and imported back

    【讨论】:

      【解决方案2】:

      您可以为现有 Dataframe 重复使用架构

      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)))
      

      【讨论】:

        【解决方案3】:

        下面的代码将为您提供已知数据帧的格式良好的表格模式定义。当您有非常多的列并且编辑很麻烦时非常有用。然后,您现在可以将其应用到您的新数据框并相应地手动编辑您可能想要的任何列。

        from pyspark.sql.types import StructType
        
        schema = [i for i in df.schema] 
        

        然后从这里,你就有了你的新架构:

        NewSchema = StructType(schema)
        

        【讨论】:

          【解决方案4】:

          如果您正在从 PySpark 中寻找 DDL 字符串:

          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()
          

          【讨论】:

            猜你喜欢
            • 2022-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-23
            • 1970-01-01
            • 1970-01-01
            • 2017-02-06
            • 1970-01-01
            相关资源
            最近更新 更多