apache-spark - Databricks 架构实现问题

标签 apache-spark databricks database-schema azure-databricks delta-lake

正如有关 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/

相关文章:

scala - 如何使用Spark对MySQL(JDBC)进行join?

apache-spark - java.lang.UnsupportedOperationException : 'Writing to a non-empty Cassandra Table is not allowed

python-3.x - 如何使用 python 从 Azure Data Lake Gen 2 读取文件

python - 尝试访问 Azure Databricks 中的 Azure DBFS 文件系统时出现装载错误

mysql - 什么更好 - 多张小 table 还是一张大 table ?

apache-spark - SparkR 2.0分类: how to get performance matrices?

xml - 如何在使用 spark 解析 xml 时将标题信息添加到行信息

mysql - (有点)复杂的数据库结构与简单的——带有空字段

database-schema - 出生和死亡是否作为事件建模为家谱中的事件或属性

scala - 如何在Dataframe上使用Spark中DataFrameNaFunctions类提供的函数?