【问题标题】:How to generate key-value format using Scala in Spark如何在 Spark 中使用 Scala 生成键值格式
【发布时间】:2016-04-04 16:24:26
【问题描述】:

我正在 VirtualBox 上学习 Spark。我使用 ./bin/spark-shell 打开 Spark 并使用 Scala。现在我对使用 Scala 的键值格式感到困惑。

我在 home/feng/spark/data 中有一个 txt 文件,看起来像:

panda 0
pink 3
pirate 3
panda 1
pink 4

我使用 sc.textFile 来获取这个 txt 文件。如果我这样做了

val rdd = sc.textFile("/home/feng/spark/data/rdd4.7")

然后我可以使用 rdd.collect() 在屏幕上显示 rdd:

scala> rdd.collect()
res26: Array[String] = Array(panda 0, pink 3, pirate 3, panda 1, pink 4)

但是,如果我这样做了

val rdd = sc.textFile("/home/feng/spark/data/rdd4.7.txt")

这里没有“.txt”。然后我在使用rdd.collect()的时候就报错了:

org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/home/feng/spark/A.txt
    at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:285)
......

但我看到了其他例子。它们最后都有“.txt”。我的代码或系统有问题吗?

另一件事是当我尝试做的时候:

scala> val rddd = rdd.map(x => (x.split(" ")(0),x))
rddd: org.apache.spark.rdd.RDD[(String, String)] = MapPartitionsRDD[2] at map at <console>:29
scala> rddd.collect()
res0: Array[(String, String)] = Array((panda,panda 0), (pink,pink 3), (pirate,pirate 3), (panda,panda 1), (pink,pink 4))

我打算选择数据的第一列并将其用作键。但是 rddd.collect() 看起来不像那样,因为单词出现了两次,这是不对的。我不能继续做其他的操作,比如 mapbykey、reducebykey 或其他。我哪里做错了?

【问题讨论】:

  • 您的问题似乎与您对“.txt”的使用有些不一致。你能检查你的文本——和你的代码插入——以确保它是正确的。如果是这样,那么您的系统似乎真的一团糟。

标签: scala apache-spark rdd


【解决方案1】:

例如,我用您的数据集创建了一个String,之后我按行拆分记录,并使用SparkContextparallelize 方法创建一个RDD。请注意,在创建RDD 后,我使用其map 方法拆分存储在每条记录中的String,并将其转换为Row

import org.apache.spark.sql.Row
val text = "panda 0\npink 3\npirate 3\npanda 1\npink 4"

val rdd = sc.parallelize(text.split("\n")).map(x => Row(x.split(" "):_*))
rdd.take(3)

take 方法的输出是:

res4: Array[org.apache.spark.sql.Row] = Array([panda,0], [pink,3], [pirate,3])

关于您的第一个问题,文件不需要具有任何扩展名。因为,在这种情况下,文件被视为纯文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2018-11-07
    • 1970-01-01
    • 2013-06-10
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多