在Spark中读取多个文件并在追加

时间:2016-05-24 16:02:12

标签: apache-spark pyspark spark-dataframe

我的问题是我有多个相同结构的txt文件,我想将其导入spark。然后创建一个标识符列,汇总数据并最终堆叠它们。

E.g。其中一个文件如下所示:

   Date     A   B   C
2/21/2014   A1  11  2
2/22/2014   A1  11  5
2/23/2014   A1  21  3
2/24/2014   A1  13  5
2/25/2014   A1  23  4
2/26/2014   A1  28  4
2/27/2014   A1  32  2
2/28/2014   B1  45  4
3/1/2014    B1  39  4
3/2/2014    B1  29  4
3/3/2014    B1  49  5
3/4/2014    B1  18  4
3/5/2014    B1  30  3
3/6/2014    B1  50  5

阅读此文件后,我想添加一个提及文件名的列,更新的数据如下所示:

    Date    A   B   C   File
2/21/2014   A1  22  2   File1
2/22/2014   A1  36  2   File1
2/23/2014   A1  17  4   File1
2/24/2014   A1  30  2   File1
2/25/2014   A1  11  2   File1
2/26/2014   A1  32  2   File1
2/27/2014   A1  19  5   File1
2/28/2014   B1  22  3   File1
3/1/2014    B1  12  5   File1
3/2/2014    B1  50  3   File1
3/3/2014    B1  42  4   File1
3/4/2014    B1  37  4   File1
3/5/2014    B1  31  5   File1
3/6/2014    B1  20  3   File1

然后总结数据:

 File   A   B   C
File1   A1  167 19
File1   B1  214 27

类似地,将创建和总结另一个数据集。最后堆叠在一起。如果是2个文件,则数据集如下所示:

File    A   B   C
File1   A1  167 19
File1   B1  214 27
File2   Z10 167 19
File2   X20 214 27

我可以单独导入数据,通过将数据转换为数据帧来处理它们,然后最终堆叠它们。但我无法以自动化的方式做到这一点。任何人都可以帮助我。

非常感谢!

1 个答案:

答案 0 :(得分:1)

如果您的单个文件适合内存,则可以使用wholeTextFiles

rdd = sc.wholeTextFiles("/directorypath/*")

def appender(x):
    i = x[0]
    j = x[1].split("\n")
    k = [x.split() for x in j]
    l = [x.append(i) for x in k]
    return k

frdd = rdd.flatMap(appender)

df = frdd.toDF("Date","A","B","C","FileName")

wholeTextFiles从那里返回(文件名,文件内容)的元组,你可以附加文件名。

df.groupBy("FileName","A").count() ##sum()