提问人:Roland R. 提问时间:9/7/2023 最后编辑:Alex OttRoland R. 更新时间:9/9/2023 访问量:39
有没有办法访问增量表旧列名?
Is there a way to access a delta table old column name?
问:
我有一个表格,上面有客户 ID、creditcard_number和creditcard_type(美国运通卡、万事达卡等) 我正在努力找到一种方法:
- 使用增量湖函数将列名 creditcard_type 修改为 type 和 creditcard_number to number 的列名
- 将列的旧名称记录在某处,以便我可以访问它并使用它来修改 .ttl 文件(用于虚拟知识图谱映射),我在其中搜索旧名称并将其替换为新列名称。
我尝试使用更改数据馈送(但它只跟踪行级别的更改) 我尝试使用列映射(但列映射也不会修改数据文件)。如果它也不修改文件,我就无法在 Dremio 中看到它们(我将其用作联合体,将数据进一步加载到 Ontopic - 虚拟知识图谱工具)。
如何更改列的名称?然后访问它的旧名称。一切都必须由达美航空完成。Delta 事件能够做到这一点吗?还是我错过了什么?
答:
1赞
Alex Ott
9/9/2023
#1
是的,您可以从 Delta Lake 1.2.0 开始重命名列,至少在 Apache Spark 中是这样(不确定 Dremio) - 您需要按名称启用列映射(我的表称为):test
ALTER TABLE test SET TBLPROPERTIES (
'delta.columnMapping.mode' = 'name',
'delta.minReaderVersion' = '2',
'delta.minWriterVersion' = '5')
然后重命名列:
ALTER TABLE test rename column creditcard_type to type;
ALTER TABLE test rename column creditcard_number to number
您可以使用如下方法从 Delta 表历史记录中提取旧名称和新名称(提取历史记录,仅保留操作并从列中选择旧名称和新名称):RENAME COLUMN
operationParameters
# fetch history for the table
tdf = spark.sql("describe history test") \
.filter("operation='RENAME COLUMN'") \
.selectExpr("operationParameters['oldColumnPath'] as old_name",
"operationParameters['newColumnPath'] as new_name")
# convert dataframe into a dict old_name -> new_name
names_mapping = dict([[r[0], r[1]] for r in tdf.collect()])
会给你:
>>> names_mapping
{'creditcard_number': 'number', 'creditcard_type': 'type'}
评论