Apache spark 插入时增量表中的自动增量id

Apache spark 插入时增量表中的自动增量id,apache-spark,pyspark,apache-spark-sql,delta-lake,Apache Spark,Pyspark,Apache Spark Sql,Delta Lake,我在使用pysparkSQL和delta表合并csv文件时遇到问题。我设法创建了upsert函数,匹配时更新,不匹配时插入 我想将列ID添加到最终的增量表中,并在每次插入数据时增加它。此列标识增量表中的每一行。有什么办法可以做到这一点吗 def Merge(dict1, dict2): res = {**dict1, **dict2} return res def create_default_values_dict(correspondance_df,marketplace)

我在使用pysparkSQL和delta表合并csv文件时遇到问题。我设法创建了upsert函数,匹配时更新,不匹配时插入

我想将列
ID
添加到最终的增量表中,并在每次插入数据时增加它。此列标识增量表中的每一行。有什么办法可以做到这一点吗

def Merge(dict1, dict2):
    res = {**dict1, **dict2}
    return res

def create_default_values_dict(correspondance_df,marketplace):
    dict_output = {}
    for field in get_nan_keys_values(get_mapping_dict(correspondance_df, marketplace)):
        dict_output[field] = 'null'
        # We want to increment the id row each time we perform an insertion (TODO TODO TODO)
#         if field == 'id':
#             dict_output['id'] = col('id')+1
#         else:    
    return dict_output


def create_matched_update_dict(mapping, products_table, updates_table):
    output = {}
    for k,v in mapping.items():
        if k == 'source_name':
            output['products.source_name'] = lit(v)
        else:
            output[products_table + '.' + k] = F.when(col(updates_table + '.' + v).isNull(), col(products_table + '.' + k)).when(col(updates_table + '.' + v).isNotNull(), col(updates_table + '.' + v))     
    return output    

insert_dict = create_not_matched_insert_dict(mapping, 'products', 'updates')
default_dict = create_default_values_dict(correspondance_df_products, 'Cdiscount')

insert_values = Merge(insert_dict, default_dict)
update_values = create_matched_update_dict(mapping, 'products', 'updates')

delta_table_products.alias('products').merge(
    updates_df_table.limit(20).alias('updates'),
    "products.barcode_ean == updates.ean") \
    .whenMatchedUpdate(set = update_values) \
    .whenNotMatchedInsert(values = insert_values)\
    .execute()


我试图在函数
create\u default\u values\u dict
中增加列
id
,但它似乎不起作用,不能自动增加1。还有别的办法解决这个问题吗?提前感谢:)

增量不支持自动增量列类型

一般来说,Spark不使用自动递增ID,而是支持单调递增ID。请参见
函数。单调递增的\u id()

如果要实现自动增量行为,必须使用多个增量操作,例如,查询最大值+将其添加到通过窗口函数计算的
行数()
列中+然后写入。这是有问题的,原因有二:

  • 除非引入外部锁定机制或其他方法来确保在查找最大值和写入之间不会发生表更新,否则最终可能会产生无效数据

  • 使用
    row\u number()
    将并行性降低到1,强制所有数据通过单个核心,这对于大数据来说非常缓慢

  • 总之,您确实不希望使用带有Spark的自动增量列


    希望这有帮助。

    增量不支持自动增量列类型

    一般来说,Spark不使用自动递增ID,而是支持单调递增ID。请参见
    函数。单调递增的\u id()

    如果要实现自动增量行为,必须使用多个增量操作,例如,查询最大值+将其添加到通过窗口函数计算的
    行数()
    列中+然后写入。这是有问题的,原因有二:

  • 除非引入外部锁定机制或其他方法来确保在查找最大值和写入之间不会发生表更新,否则最终可能会产生无效数据

  • 使用
    row\u number()
    将并行性降低到1,强制所有数据通过单个核心,这对于大数据来说非常缓慢

  • 总之,您确实不希望使用带有Spark的自动增量列

    希望这有帮助