Apache Spark 如何使用Python字典和SQL UPDATE命令更新增量表中具有MAP数据类型的列的值?

vc6uscn9  于 2023-03-30  发布在  Apache
关注(0)|答案(1)|浏览(108)

我在Databricks中有一个增量表,创建者为:

%sql
 
CREATE TABLE IF NOT EXISTS dev.bronze.test_map (
    id INT,
    table_updates MAP<STRING, TIMESTAMP>,
 
  CONSTRAINT test_map_pk PRIMARY KEY(id)
  
  ) USING DELTA
LOCATION "abfss://bronze@Table Path"

初始值:

INSERT INTO dev.bronze.test_map 
VALUES (1, null), 
       (2, null), 
       (3, null);

注意,在列“table_updates”中没有值。

在我们的平台中处理其他表之后,我将表更新信息作为Python字典,如下所示:

table_updates_id1  =  
 
{'id1_table_1': datetime.datetime(2023, 3, 26, 4, 33, 22, 323000),
 
 'id1_table_2': datetime.datetime(2023, 3, 26, 4, 33, 22, 323000)}

现在,我想使用“SQL UPDATE命令”更新id=1的列“table_update”的值(注意,我想更新表而不是 Dataframe )。
我尝试了不同的方法,但都失败了。

第1次试验:

spark.sql(f"""
UPDATE dev.bronze.test_map
SET
    table_updates = map({table_updates_id1})
WHERE
    id = 1
""")

错误:

第二次试验:

spark.sql(f"""
UPDATE dev.bronze.test_map
SET
    table_updates = map('{','.join([f'{k},{v}' for k,v in table_updates_id1.items()])}')
WHERE
    id = 1
""")

错误:

有什么办法解决这个问题吗?谢谢。

f45qwnt8

f45qwnt81#

这一点:

f"""map('{','.join([f'{k},{v}' for k,v in table_updates_id1.items()])}')""")

结果:

map('id1_table_1,2023-03-26 04:33:22.323000,id1_table_2,2023-03-26 04:33:22.323000')

它实际上是'map'中的一个字符串。您需要将每个值引用起来:

f"""map({','.join([f"'{k}','{v}'" for k,v in table_updates_id1.items()])})"""

结果是:

map('id1_table_1','2023-03-26 04:33:22.323000','id1_table_2','2023-03-26 04:33:22.323000')

相关问题