我想问一下实现每个键自动增量的最佳方法 排序后的数字,例如。 :
原始文件:
1,a,b,c,1,1
1,a,b,d,0,0
1,a,b,e,1,0
2,a,e,c,0,0
2,a,f,d,1,0
后期输出(最后一列是分组后的位置编号 前三个字段和最后两个值的反向排序)
1,a,b,c,1,1,1
1,a,b,d,0,0,3
1,a,b,e,1,0,2
2,a,e,c,0,0,2
2,a,f,d,1,0,1
我正在使用使用groupbykey的解决方案但是遇到了一些问题 问题(可能是pyspark / spark的错误?),想知道是否有 更好的方法来实现这一目标。
我的解决方案:
A = sc.textFile("train.csv")
.filter(lambda x:not isHeader(x))
.map(split)
.map(parse_train)
.filter(lambda x: not x is None)
B = A.map(lambda k:((k.first_field,k.second_field,k.first_field,k.third_field),(k[0:5])))
.groupByKey()
B.map(sort_n_set_position)
.flatMap(lambda line: line)
其中sort和set位置迭代迭代器并执行 排序和添加最后一列
答案 0 :(得分:1)
由于你有大键(所有3个第一个值),我假设每个键不会有大量的行。鉴于此,我只使用groupByKey([numTasks])
然后使用普通代码对索引进行排序并将其添加到生成的迭代中的每一行。
答案 1 :(得分:1)
结合spark-csv
,DataFrames和窗口函数的不同方法。为简洁起见,我假设标题行为x1,x2,x4,x4,x5,x6
:
from pyspark.sql.window import Window
from pyspark.sql.functions import rowNumber, col
df = (sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.option("inferSchema", "true")
.load("train.csv"))
w = (Window()
.partitionBy(col("x1"), col("x2"), col("x3"))
.orderBy(col("x5").desc(), col("x6").desc()))
df_with_rn = df.select(col("*"), rowNumber().over(w).alias("x7"))
df_with_rn.show()
## +---+---+---+---+---+---+---+
## | x1| x2| x3| x4| x5| x6| x7|
## +---+---+---+---+---+---+---+
## | 2| a| e| c| 0| 0| 1|
## | 2| a| f| d| 1| 0| 1|
## | 1| a| b| c| 1| 1| 1|
## | 1| a| b| e| 1| 0| 2|
## | 1| a| b| d| 0| 0| 3|
## +---+---+---+---+---+---+---+
如果您想要一个简单的RDD
作为输出,您可以简单地映射如下:
df_with_rn.map(lambda r: r.asDict())