Spark DataFrame根据权重col值附加行n次

时间:2018-04-27 15:10:12

标签: apache-spark dataframe rdd

我想要做的就是过度采样"一个小的csv文件,每行都有一个权重值列。

jQuery( document ).ajaxComplete(function() {
  jQuery("a.button.product_type_simple.add_to_cart_button.ajax_add_to_cart.added" ).text("ADDED");
  setTimeout(function(){ jQuery("a.button.product_type_simple.add_to_cart_button.ajax_add_to_cart.added" ).text("Add to bag");}, 5000)
}); 

Age|City|Weight
20 | NY |2
30 | SF |3

用panda和np我做了这个

 Age|City|
 20 | NY |
 20 | NY |
 30 | SF |
 30 | SF |
 30 | SF |

但它太慢了,它使用100%的1个CPU(15个可用)和所有65G内存超过24小时,最后崩溃。 最终文件应包含更多的7000万行。

所以我尝试使用Spark。

df = pd.read_csv('file.csv',low_memory=False) weights=round(df.weight) df.loc[np.repeat(df.index.values,weights)] 或类似的内容,加上rdd.map(lamba x: rdd.udf())应该有所帮助,但我不明白如何做到正确。 最后,我需要将DataFrame或RDD保存在一个未分区的CSV中:一个可以和panda一起使用的csv。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您可以在内存中加载数据并且计划在本地使用Pandas读取输出,则没有任何迹象表明您需要Spark。只需简单说明

import csv

with open("input.csv") as fr, open("output.csv", "w") as fw:
    reader = csv.reader(fr)
    writer = csv.writer(fw)
    for age, city, weight in reader:
        if age == "age":
            writer.writerow((age, city))
        else:
            writer.writerows((age, city) for _ in range(int(weight)))

或列数较多(我假设权重是最后一列,根据实际数据的形状进行调整):

with open("input.csv") as fr, open("output.csv", "w") as fw:
    reader = csv.reader(fr)
    writer = csv.writer(fw)
    for row:
        if row[0] == "age":
            writer.writerow(row[:-1])  
        else:
            writer.writerows(row[:-1] for _ in range(int(row[-1])))

答案 1 :(得分:0)

好吧,我应该让它运行谢谢:

with open("file_in.csv",encoding='utf-8') as fr, open("file_out.csv", "w",encoding='utf-8') as fw:
reader = csv.reader(fr)
writer = csv.writer(fw)

for row in reader:
    if row[0] == "firstColName" :
        writer.writerow(row[:-1])  
    else:
        writer.writerows(row[:-1] for _ in range(int(row[-1])))