带有数据定义的火花数据框架架构

Posted

技术标签:

【中文标题】带有数据定义的火花数据框架架构【英文标题】:spark data frame Schema With Data Definitions 【发布时间】:2021-08-19 00:43:43 【问题描述】:

我正在尝试将 cmets 添加到字段(带有数据定义的架构),下面是我正在尝试的实现。

尝试使用 StructType.add()(cmets 中的代码)以及 StructType([ StructField("filed",dtype,boolean,metadata )]

出现以下错误。不确定此实现是否有效,有人可以在这里帮助我吗,我是新手。

我正在寻找类似的输出(带有数据定义的架构)

df.printSchema()

root
 |-- firstname: string (nullable = true) comments:val1
 |-- middlename: string (nullable = true) comments:val2
 |-- lastname: string (nullable = true) comments:val3
 |-- id: string (nullable = true) comments:val4
 |-- gender: string (nullable = true) comments:val5
 |-- salary: integer (nullable = true) comments:val6

错误:

IllegalArgumentException: Failed to convert the JSON string '"metadata":"val1","name":"firstname","nullable":true,"type":"string"' to a field.

我正在尝试将 cmets 添加到该字段的代码:

import pyspark
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType,StructField, StringType, IntegerType

spark = SparkSession.builder.master("local[1]") \
                    .appName('SparkByExamples.com') \
                    .getOrCreate()

data = [("James","","Smith","36636","M",3000),
    ("Michael","Rose","","40288","M",4000),
    ("Robert","","Williams","42114","M",4000),
    ("Maria","Anne","Jones","39192","F",4000),
    ("Jen","Mary","Brown","","F",-1)
  ]

schema = StructType([ \
    StructField("firstname",StringType(),True,'val1'), \
    StructField("middlename",StringType(),True,'val2'), \
    StructField("lastname",StringType(),True,'val3'), \
    StructField("id", StringType(), True,'val4'), \
    StructField("gender", StringType(), True,'val5'), \
    StructField("salary", IntegerType(), True,'val6') \
  ])


# schema= StructType().add("firstname",StringType(),True,'val1').add("middlename",StringType(),True,'val2') \
.add("lastname",StringType(),True,'val3').add("id", StringType(), True,'val4').add("gender", StringType(), True,'val5').add("salary", IntegerType(), True,'val6')
          
         
df = spark.createDataFrame(data=data,schema=schema)
df.printSchema()
df.show(truncate=False)

【问题讨论】:

【参考方案1】:

StructField 的metadata 参数需要一个字典对象的参数。应该是这样的

StructField("firstname", StringType(), True, "comment":"val1")

【讨论】:

建议我更新为 'StructField("firstname",StringType(),True,"comment":"val1")' 并将其应用于其他列。 df.printSchema() "root |-- firstname: string (nullable = true)" .printSchema() 不显示架构的元数据。作为替代方案,您可以使用 df.schema.jsonValue() 以 json 格式显示架构及其元数据。

以上是关于带有数据定义的火花数据框架架构的主要内容,如果未能解决你的问题,请参考以下文章

自定义数据源的自动火花模式推断

从自定义数据格式创建火花数据框

火花连接数据帧和合并模式

在火花数据框中使用案例类的好处[重复]

火花数据框保存到带有自动增量列的 SQL 表

如何从带有火花的数据框中找到最大长度的唯一行?