Apache spark 如何将多个具有Double的CSV文件合并到具有其文件名的单个RDD中?

Apache spark 如何将多个具有Double的CSV文件合并到具有其文件名的单个RDD中?,apache-spark,pyspark,correlation,Apache Spark,Pyspark,Correlation,我有3组CSV文件,基本上是一个双倍值列表(每行一个双倍值),每月拆分: A: aJan.csv, aFeb.csv, aMarch.csv B: bJan.csv, bFeb.csv, bMarch.csv C: cJan.csv, cFeb.csv, cMarch.csv D: DJan.csv, DFeb.csv, DMarch.csv 我想计算A,B,C,D上的所有对皮尔逊相关。PySpark有一个相关方法 data = sc.parallelize( np.array([r

我有3组CSV文件,基本上是一个双倍值列表(每行一个双倍值),每月拆分:

A: aJan.csv, aFeb.csv, aMarch.csv
B: bJan.csv, bFeb.csv, bMarch.csv
C: cJan.csv, cFeb.csv, cMarch.csv 
D: DJan.csv, DFeb.csv, DMarch.csv
我想计算A,B,C,D上的所有对皮尔逊相关。PySpark有一个相关方法

data = sc.parallelize(
    np.array([range(10000), range(10000, 20000),range(20000, 30000)]).transpose()) 
print(Statistics.corr(data, method="pearson")) 
我的问题是如何从3个文件(即aJan.csv、aFeb.csv、aMarch.csv)中生成1 RDD,然后类似地为其他文件生成1 RDD。我知道我可以像这里提到的那样做:但是我想要月附加格式的单一视图,即第一个数据是从一月到二月再到三月

我如何从3个文件中创建1RDD

请不要。考虑到您的问题,您似乎刚刚开始了进入Spark的旅程,您将使用低级RDDAPI,它……不……适合……您(很抱歉暂停,但想表达我对它的感受)

如果你坚持

我想你应该从接线员开始

wholeTextFiles(路径:String,minPartitions:Int=defaultMinPartitions):RDD[(String,String)]从HDFS、本地文件系统(可在所有节点上使用)或任何Hadoop支持的文件系统URI读取文本文件目录。每个文件作为单个记录读取,并以键-值对的形式返回,其中键是每个文件的路径,值是每个文件的内容

这将为您提供CSV文件的内容及其路径。有了它,只需根据需要转换RDD,对其进行排序,就可以了


请考虑使用SataSql的DataSet API来提供代码>星火.Read .CSV 和<代码> OrthBuy < /C> >以及更多。请帮个忙

我如何从3个文件中创建1RDD

请不要。考虑到您的问题,您似乎刚刚开始了进入Spark的旅程,您将使用低级RDDAPI,它……不……适合……您(很抱歉暂停,但想表达我对它的感受)

如果你坚持

我想你应该从接线员开始

wholeTextFiles(路径:String,minPartitions:Int=defaultMinPartitions):RDD[(String,String)]从HDFS、本地文件系统(可在所有节点上使用)或任何Hadoop支持的文件系统URI读取文本文件目录。每个文件作为单个记录读取,并以键-值对的形式返回,其中键是每个文件的路径,值是每个文件的内容

这将为您提供CSV文件的内容及其路径。有了它,只需根据需要转换RDD,对其进行排序,就可以了



请考虑使用SataSql的DataSet API来提供代码>星火.Read .CSV 和<代码> OrthBuy < /C> >以及更多。请帮你自己一个忙。

我建议以下方法:

首先,获取初始数据的并行集(对于优化调度,如果您对数据执行任何其他操作,请在下面的
union
之前),其中包含MOUNT->file_for_MOUNT.csv的显式或隐式映射

i、 e:

val files = Set (("January","aJan.csv"),("February","aFeb.csv")).par
然后您可以生成一组数据帧,如下所示:

val monthDfs = files.map(
                         month => 
                           spark.read.csv("month._2")
                                .withColum("month", literal(month._1))
                        )
files.reduce((a,b) => a.union(b))
要将它们组合到单个数据帧中,请执行以下操作:

spark.createDataFrame(
    spark.sparkContext.union(
         monthDfs.map(_.rdd).toSeq
         ),
    monthDfs.head.schema)
这有点不规范,因为它使用.rdd()。。。。我有。rdd莫名其妙地失败了 在之前的运行时中,我可以通过将其分配给最终映射范围之外的变量来修复它。YYMV)

但是,瞧,您有一个带有“month”列的数据框,包含所有数据。如果你害怕.rdd(你应该害怕),而文件的数量不是数万个,那么你也可以简单地使用如下内容:

val monthDfs = files.map(
                         month => 
                           spark.read.csv("month._2")
                                .withColum("month", literal(month._1))
                        )
files.reduce((a,b) => a.union(b))

不过,这些操作是执行图的一部分,并且会随着文件中元素数量的增加而增大执行图的大小——最终导致~1000个元素范围内的某个地方出现减速甚至崩溃。见:和。

我提出以下方法:

首先,获取初始数据的并行集(对于优化调度,如果您对数据执行任何其他操作,请在下面的
union
之前),其中包含MOUNT->file_for_MOUNT.csv的显式或隐式映射

i、 e:

val files = Set (("January","aJan.csv"),("February","aFeb.csv")).par
然后您可以生成一组数据帧,如下所示:

val monthDfs = files.map(
                         month => 
                           spark.read.csv("month._2")
                                .withColum("month", literal(month._1))
                        )
files.reduce((a,b) => a.union(b))
要将它们组合到单个数据帧中,请执行以下操作:

spark.createDataFrame(
    spark.sparkContext.union(
         monthDfs.map(_.rdd).toSeq
         ),
    monthDfs.head.schema)
这有点不规范,因为它使用.rdd()。。。。我有。rdd莫名其妙地失败了 在之前的运行时中,我可以通过将其分配给最终映射范围之外的变量来修复它。YYMV)

但是,瞧,您有一个带有“month”列的数据框,包含所有数据。如果你害怕.rdd(你应该害怕),而文件的数量不是数万个,那么你也可以简单地使用如下内容:

val monthDfs = files.map(
                         month => 
                           spark.read.csv("month._2")
                                .withColum("month", literal(month._1))
                        )
files.reduce((a,b) => a.union(b))

不过,这些操作是执行图的一部分,并且会随着文件中元素数量的增加而增大执行图的大小——最终导致~1000个元素范围内的某个地方出现减速甚至崩溃。请参阅:和。

我以前是这样解决的:将csv集合映射到数据帧上,附加月份信息,然后使用SparkContext.unionAll(RDD)合并它们,然后使用其中一个数据帧的模式,并将其应用于合并的RDD以恢复数据帧。如果您的解决方案比我的更好(听起来确实是这样),请用答案回答你的问题。非常感谢。@RickMoritz,你能不能单独解释一下。听起来你完全知道我想做什么。@JacekLaskowski完成了-我只是想在写一个完整的答案之前,反复思考一下一般的想法:)我以前是这样解决的:将csv集合映射到数据帧上,附加月份信息,然后使用SparkContext.unionAll(RDD)合并它们,然后使用其中一个数据帧的模式,并将其应用于合并的RDD以重新获得一个数据帧。如果您的解决方案比我的(听起来确实如此)好,请用解决方案回答您的问题。非常感谢。@RickMoritz你能再解释一下吗