带有数据定义的火花数据框架架构
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 格式显示架构及其元数据。以上是关于带有数据定义的火花数据框架架构的主要内容,如果未能解决你的问题,请参考以下文章