我想使用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)
但我没有获得有关如何在特定列上加入文件的任何信息 请建议
答案 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
函数(以及许多其他有用的函数)here,Spark 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)
,这是打算用的吗?
希望这有帮助!