正如有关 schema enforcement 的文章中所建议的那样,声明的架构有助于及早发现问题。
下面描述的两个问题但是阻止我创建描述性模式。
表列上的注释被视为架构中的差异
# Get data
test_df = spark.createDataFrame([('100000146710')], ['code'])
# ... save
test_df.write.format("delta").mode("append").save('/my_table_location')
# Create table: ... BOOM
spark.sql("""
CREATE TABLE IF NOT EXISTS my_table (
code STRING COMMENT 'Unique identifier'
) USING DELTA LOCATION '/my_table_location'
""")
这将失败,并显示 AnalysisException: 指定的架构与/my_table_location 处的现有架构不匹配。我找到的唯一解决方案是删除专栏评论。
非空结构字段显示为可为空
json_schema = StructType([
StructField("code", StringType(), False)
])
json_df = (spark.read
.schema(json_schema)
.json('/my_input.json')
)
json_df.printSchema()
将显示
root
|-- code: string (nullable = true)
因此,尽管架构声明声明某个字段不为空,但该字段在数据帧中显示为可空。因此,在表列上添加 NOT NULL 约束将触发 AnalysisException 错误。
欢迎任何意见或建议。
最佳答案
随着执行
test_df.write.format("delta").mode("append").save('/my_table_location')
您已经创建了一个新的 Delta 表,其特定架构由 test_df
定义。此新表 delta.`/my_table_location`
已具有 code STRING
的架构。
如果您想在架构中创建注释,也许首先创建您希望定义的表,例如
spark.sql("""
CREATE TABLE my_table
code STRING COMMENT 'unique identifier'
USING DELTA LOCATION '/my_table_location'
""")
然后将 test_df 中的数据插入其中,例如
test_df.createOrReplaceView("test_df_view")
spark.sql("""
INSERT INTO my_table (code) SELECT code FROM test_df_view
""")
关于apache-spark - Databricks 架构实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67304155/