【问题标题】:how to merge two columns with a condition in pyspark?如何将两列与pyspark中的条件合并?
【发布时间】:2016-11-17 15:25:44
【问题描述】:

我能够对值进行合并和排序,但无法确定如果值相等则不合并的条件

df = sqlContext.createDataFrame([("foo", "bar","too","aaa"), ("bar", "bar","aaa","foo")], ("k", "K" ,"v" ,"V"))
columns = df.columns

k = 0
for i in range(len(columns)):
    for j in range(i + 1, len(columns)):
       if columns[i].lower() == columns[j].lower(): 
        k = k+1
        df = (df.withColumn(columns[i]+str(k),concat(col(columns[i]),lit(","), col(columns[j]))))
        newdf = df.select( col("k"),split(col("c1"), ",\s*").alias("c1"))
        sortDf = newdf.select(newdf.k,sort_array(newdf.c1).alias('sorted_c1'))

在下表中,列 k 和 K 仅合并 [foo,bar] 而不是 [bar,bar]

输入:

+---+---+---+---+
|  k|  K|  v|  V|
+---+---+---+---+
|foo|bar|too|aaa|
|bar|bar|aaa|foo|
+---+---+---+---+

输出:

+---+---+---+---+-----------+
|  k|  K|Merged K |Merged V |
+---+---+-------------------+
|foo|bar|[foo,bar] |[too,aaa]
|bar|bar|bar       |[aaa,foo]
+---+---+---+------+--------+

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql pyspark-sql


    【解决方案1】:

    试试:

    from pyspark.sql.functions import udf
    
    def merge(*c):
        merged = sorted(set(c))
        if len(merged) == 1:
            return merged[0]
        else:
            return "[{0}]".format(",".join(merged))
    
    merge_udf = udf(merge)
    
    df = sqlContext.createDataFrame([("foo", "bar","too","aaa"), ("bar", "bar","aaa","foo")], ("k1", "k2" ,"v1" ,"v2"))
    
    df.select(merge_udf("k1", "k2"), merge_udf("v1", "v2"))
    

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 2022-10-23
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多