基于两列创建决策树

时间:2018-08-18 19:17:23

标签: algorithm apache-spark decision-tree

我正在使用Spark进行一些大数据处理。但是我认为这个问题是独立的。我在其他一些列中设置了以下数据集:

--------------------------------------------------
| Name      | Corrected_Name                     |
--------------------------------------------------
| Pawan     | Varun                              |
--------------------------------------------------
| Varun     | Naresh                             |
--------------------------------------------------
| Dona      | Pia                                |
--------------------------------------------------

现在,我正在尝试更正所有名称,因此在这种情况下,我将不得不找到链条Pawan-> Varun-> Naresh。有没有办法在Spark或其他算法中处理此问题?

1 个答案:

答案 0 :(得分:0)

首先,请注意,由于重复频繁,姓名通常是错误的标识符。如果您最终不得不“压缩”链条(将2行转换为1行),那么按名称本身减少将导致混乱。

关于原始问题,这是一种常见的情况,应该进行迭代计算,这种用例具有两个可能的方向:

  1. 在内存中(应该对数据进行假设)-将所有数据收集到一台计算机中,在内存中执行映射,然后Broadcast将结果复制到其他计算机。
  2. 分布式映射(不考虑任何数据,非常昂贵)-执行分布式下一步查询,可以进行优化以执行log(n)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)是首选的计算大小,但您必须基准化内存占用量