VB_*_*VB_ 5 hive apache-spark databricks aws-glue
管理 Spark 表模式的最佳方法是什么?您是否看到选项 2 的任何缺点?你能提出更好的选择吗?
选项 1:为代码和元存储保留单独的定义
这种方法的缺点是您一直保持它们同步(容易出错)。另一个缺点 - 如果表有 500 列,它会变得很麻烦。
create_some_table.sql [第一个定义]
-- Databricks syntax (internal metastore)
CREATE TABLE IF NOT EXISTS some_table (
Id int,
Value string,
...
Year int
)
USING PARQUET
PARTITION BY (Year)
OPTIONS (
PATH 'abfss://...'
)
Run Code Online (Sandbox Code Playgroud)
some_job.py [第二定义]
def run():
df = spark.read.table('input_table') # 500 columns
df = transorm(df)
# this logic should be in `transform`, but anycase it should be
df = df.select(
'Id', 'Year', F.col('Value').cast(StringType()).alias('Value') # actually another schema definition: you have to enumerate all output columns
)
df.write.saveAsTable('some_table')
Run Code Online (Sandbox Code Playgroud)
test_some_job.py [第三个定义]
def test_some_job(spark):
output_schema = ... # another definition
expected = spark.createDataFrame([...], output_schema)
Run Code Online (Sandbox Code Playgroud)
选项 2:在代码中只保留一个定义(StructType)
可以动态生成模式。这种方法的好处 - 是简单和单一位置的模式定义。你看到任何缺点吗?
def run(input: Table, output: Table):
df = spark.read.table(input.name)
df = transform(df)
save(df, output)
def save(df: DataFrame, table: Table):
df \
.select(table.schema.fieldNames()) \
.write \
.partitionBy(table.partition_by) \
.option('path', table.path) \
.saveAsTable(table.name)
# In case table doesn't exists, Databricks will automatically generate table definition
class Table(NamedTuple):
name: str
path: str
partition_by: List[str]
schema: StructType
Run Code Online (Sandbox Code Playgroud)
我先说几点,然后提出建议。
databricks和aws-glue推荐:
USING PARQUETUSING DELTA结果:
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |