SCALA:读取文本文件并创建它的元组

SCALA:读取文本文件并创建它的元组,scala,apache-spark,tuples,Scala,Apache Spark,Tuples,如何从下面的现有RDD创建元组 // reading a text file "b.txt" and creating RDD val rdd = sc.textFile("/home/training/desktop/b.txt") b、 txt数据集--> 如果您打算使用数组[Tuples4],则可以执行以下操作 scala> val rdd = sc.textFile("file:/home/training/desktop/b.txt") rdd: org.apache.sp

如何从下面的现有RDD创建元组

// reading a text file "b.txt" and creating RDD 
val rdd = sc.textFile("/home/training/desktop/b.txt") 
b、 txt数据集-->


如果您打算使用
数组[Tuples4]
,则可以执行以下操作

scala> val rdd = sc.textFile("file:/home/training/desktop/b.txt")
rdd: org.apache.spark.rdd.RDD[String] = file:/home/training/desktop/b.txt MapPartitionsRDD[5] at textFile at <console>:24

scala> val arrayTuples = rdd.map(line => line.split(",")).map(array => (array(0), array(1), array(2), array(3))).collect
arrayTuples: Array[(String, String, String, String)] = Array((" Ankita",26,BigData,newbie), (" Shikha",30,Management,Expert))
已更新

如果您有可变大小的输入文件作为

Ankita,26,BigData,newbie
Shikha,30,Management,Expert
Anita,26,big
您可以将匹配大小写模式匹配写为

scala> val arrayTuples = rdd.map(line => line.split(",") match {
     | case Array(a, b, c, d) => (a,b,c,d)
     | case Array(a,b,c) => (a,b,c)
     | }).collect
arrayTuples: Array[Product with Serializable] = Array((Ankita,26,BigData,newbie), (Shikha,30,Management,Expert), (Anita,26,big))
再次更新

正如@eliasah所指出的,上面的过程是一个糟糕的实践,它使用的是
产品迭代器
。正如他的建议,我们应该知道输入数据的最大元素,并使用以下逻辑,其中我们没有为任何元素指定默认值

val arrayTuples = rdd.map(line => line.split(",")).map(array => (Try(array(0)) getOrElse("Empty"), Try(array(1)) getOrElse(0), Try(array(2)) getOrElse("Empty"), Try(array(3)) getOrElse("Empty"))).collect
正如@philantrovert所指出的,如果我们不使用
REPL

arrayTuples.foreach(println)
结果是什么

(Ankita,26,BigData,newbie)
(Shikha,30,Management,Expert)
(Anita,26,big,Empty)

如果您打算使用
数组[Tuples4]
,则可以执行以下操作

scala> val rdd = sc.textFile("file:/home/training/desktop/b.txt")
rdd: org.apache.spark.rdd.RDD[String] = file:/home/training/desktop/b.txt MapPartitionsRDD[5] at textFile at <console>:24

scala> val arrayTuples = rdd.map(line => line.split(",")).map(array => (array(0), array(1), array(2), array(3))).collect
arrayTuples: Array[(String, String, String, String)] = Array((" Ankita",26,BigData,newbie), (" Shikha",30,Management,Expert))
已更新

如果您有可变大小的输入文件作为

Ankita,26,BigData,newbie
Shikha,30,Management,Expert
Anita,26,big
您可以将匹配大小写模式匹配写为

scala> val arrayTuples = rdd.map(line => line.split(",") match {
     | case Array(a, b, c, d) => (a,b,c,d)
     | case Array(a,b,c) => (a,b,c)
     | }).collect
arrayTuples: Array[Product with Serializable] = Array((Ankita,26,BigData,newbie), (Shikha,30,Management,Expert), (Anita,26,big))
再次更新

正如@eliasah所指出的,上面的过程是一个糟糕的实践,它使用的是
产品迭代器
。正如他的建议,我们应该知道输入数据的最大元素,并使用以下逻辑,其中我们没有为任何元素指定默认值

val arrayTuples = rdd.map(line => line.split(",")).map(array => (Try(array(0)) getOrElse("Empty"), Try(array(1)) getOrElse(0), Try(array(2)) getOrElse("Empty"), Try(array(3)) getOrElse("Empty"))).collect
正如@philantrovert所指出的,如果我们不使用
REPL

arrayTuples.foreach(println)
结果是什么

(Ankita,26,BigData,newbie)
(Shikha,30,Management,Expert)
(Anita,26,big,Empty)

你期望的元组是什么?提供一些样品期望的元组——((Ankita,26岁,大数据,新手),(Shikha,30岁,管理,专家))你想要元组数组,对吗?是的。。这也很好:)你期望的元组是什么?提供一些样品期望的元组——((Ankita,26岁,大数据,新手),(Shikha,30岁,管理,专家))你想要元组数组,对吗?是的。。那也很好:)非常感谢。它起作用了。我们是否可以根据不同行的不同列数动态创建数组。请参阅我的更新答案:)并感谢您的支持和接受:)推断产品是一种糟糕的做法@RameshMaharjan。就我个人而言,我会使用默认值(可能是null或空字符串),并将其保留为元组4。您还可以将
foreach
println
一起使用。不说
map
是错误的,但是使用
foreach
表示这段代码有副作用是一个很好的实践。看起来很棒+非常感谢。它起作用了。我们是否可以根据不同行的不同列数动态创建数组。请参阅我的更新答案:)并感谢您的支持和接受:)推断产品是一种糟糕的做法@RameshMaharjan。就我个人而言,我会使用默认值(可能是null或空字符串),并将其保留为元组4。您还可以将
foreach
println
一起使用。不说
map
是错误的,但是使用
foreach
表示这段代码有副作用是一个很好的实践。看起来很棒+1.