在Spark中加入两个HDFS文件

时间:2014-03-19 09:00:49

标签: scala hadoop apache-spark

我想使用spark shell从HDFS加入两个文件。 两个文件都是分隔符,我想加入第二列

尝试过的代码 但不提供任何输出

val ny_daily= sc.parallelize(List("hdfs://localhost:8020/user/user/NYstock  /NYSE_daily"))

val ny_daily_split = ny_daily.map(line =>line.split('\t'))

val enKeyValuePair = ny_daily_split.map(line => (line(0).substring(0, 5), line(3).toInt))


val ny_dividend= sc.parallelize(List("hdfs://localhost:8020/user/user/NYstock/NYSE_dividends"))

val ny_dividend_split = ny_dividend.map(line =>line.split('\t'))

val enKeyValuePair1 = ny_dividend_split.map(line => (line(0).substring(0, 4),     line(3).toInt))

enKeyValuePair1.join(enKeyValuePair)

但我没有获得有关如何在特定列上加入文件的任何信息 请建议

1 个答案:

答案 0 :(得分:4)

  

我没有获得有关如何在特定列上加入文件的任何信息

RDD在他们的密钥上加入,所以当你写下来时决定要加入的列:

val enKeyValuePair = ny_daily_split.map(line => (line(0).substring(0, 5), line(3).toInt))
...
val enKeyValuePair1 = ny_daily_split.map(line => (line(0).substring(0, 4), line(3).toInt))

您的RDD将加入来自line(0).substring(0, 5)line(0).substring(0, 4)的值。

您可以找到join函数(以及许多其他有用的函数)hereSpark Programming Guide是了解Spark如何工作的绝佳参考。

  

尝试过代码但没有提供任何输出

要查看输出,您必须要求Spark打印它:

enKeyValuePair1.join(enKeyValuePair).foreach(println)

注意:从您应该使用sc.textFile()的文件加载数据:sc.parallelize()仅用于从Scala集合中生成RDD。

以下代码应该完成这项工作:

val ny_daily_split = sc.textFile("hdfs://localhost:8020/user/user/NYstock/NYSE_daily").map(line =>line.split('\t'))
val ny_dividend_split = sc.textFile("hdfs://localhost:8020/user/user/NYstock/NYSE_dividends").map(line =>line.split('\t'))

val enKeyValuePair = ny_daily_split.map(line => line(0).substring(0, 5) -> line(3).toInt)
val enKeyValuePair1 = ny_dividend_split.map(line => line(0).substring(0, 4) -> line(3).toInt)

enKeyValuePair1.join(enKeyValuePair).foreach(println)

顺便提一下,您提到要加入第二列,但实际上是在使用line(0),这是打算用的吗?

希望这有帮助!