Apache spark Databricks模式实施问题

Apache spark Databricks模式实施问题,apache-spark,databricks,database-schema,azure-databricks,delta-lake,Apache Spark,Databricks,Database Schema,Azure Databricks,Delta Lake,正如关于的文章中所建议的,声明的模式有助于及早发现问题 然而,下面描述的两个问题阻碍了我创建描述性模式 表列上的注释被视为架构中的差异 # Get data test_df = spark.createDataFrame([('100000146710')], ['code']) # ... save test_df.write.format("delta").mode("append").save('/my_table_location') # Cre

正如关于的文章中所建议的,声明的模式有助于及早发现问题

然而,下面描述的两个问题阻碍了我创建描述性模式

表列上的注释被视为架构中的差异

# 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'
""")
这将失败,原因是分析异常:指定的架构与位于/my_table_位置的现有架构不匹配。我找到的唯一解决办法是删除columnt注释

非空结构字段显示为可空

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)
因此,尽管模式声明声明字段不为null,但该字段在数据帧中显示为null。因此,在表列上添加NOTNULL约束将触发AnalysisException错误

欢迎提出任何意见或建议。

执行

test_df.write.format("delta").mode("append").save('/my_table_location')
您已经创建了一个新的增量表,其特定架构由
test\u df
定义。此新表
delta.`/my\u table\u location`
已具有
代码字符串的架构

如果您想在模式中创建注释,可能首先按照您希望的定义创建表,例如:

spark.sql("""
   CREATE TABLE my_table 
     code STRING COMMENT 'unique identifier' 
    USING DELTA LOCATION '/my_table_location'
""") 
然后将测试数据插入其中,例如

test_df.createOrReplaceView("test_df_view")

spark.sql("""
INSERT INTO my_table (code) SELECT code FROM test_df_view
""")