我正在使用Spark进行一些大数据处理。但是我认为这个问题是独立的。我在其他一些列中设置了以下数据集:
--------------------------------------------------
| Name | Corrected_Name |
--------------------------------------------------
| Pawan | Varun |
--------------------------------------------------
| Varun | Naresh |
--------------------------------------------------
| Dona | Pia |
--------------------------------------------------
现在,我正在尝试更正所有名称,因此在这种情况下,我将不得不找到链条Pawan-> Varun-> Naresh。有没有办法在Spark或其他算法中处理此问题?
答案 0 :(得分:0)
首先,请注意,由于重复频繁,姓名通常是错误的标识符。如果您最终不得不“压缩”链条(将2行转换为1行),那么按名称本身减少将导致混乱。
关于原始问题,这是一种常见的情况,应该进行迭代计算,这种用例具有两个可能的方向:
join-cache-count
个操作(2)的pyspark代码示例:
forward = get_all_data()
current_count = -1
while(current_count != 0):
forward = forward.selectExpr("Name", "Corrected_Name as original_last_name", "Corrected_Name as connection").join(forward.selectExpr("Corrected_Name as Corrected_Name_Tmp", "Name as connection"), "connection", "left")
forward_clean = forward.withColumn("Corrected_Name", merge_udf(col("original_last_name"), col("Corrected_Name_Tmp"))).cache()
current_count = forward_clean.filter(forward_clean.Corrected_Name_Tmp.isNotNull()).count()
forward = forward_clean.drop(col("original_last_name")).drop(col("Corrected_Name_Tmp")).drop(col("connection"))
此代码将显示所有行,每行都有一个从原始“名称”到“ Corrected_Name”链中最后一个元素的映射。
注意:(2)非常浪费,但不做任何假设,可以通过加倍看力来对其进行优化以在log(n)上执行,如果只需要每个链中的第一个元素,那么可以优化看相。 (1)是首选的计算大小,但您必须基准化内存占用量