Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在Spark中过滤RDD和数据帧?_Scala_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

Scala 如何在Spark中过滤RDD和数据帧?

Scala 如何在Spark中过滤RDD和数据帧?,scala,apache-spark,apache-spark-sql,spark-dataframe,Scala,Apache Spark,Apache Spark Sql,Spark Dataframe,我有一个.tsv文件pageviews\u秒由时间戳站点和请求字段组成: "timestamp" "site" "requests" "2015-03-16T00:09:55" "mobile" 1595 "2015-03-16T00:10:39" "mobile" 1544 "2015-03-16T00:19:39" "desktop" 2460 我希望第一行消失,因为它会导致我必须对数据执行的操作出错 我试着用以下方法来做: 1.在

我有一个
.tsv
文件
pageviews\u秒
时间戳
站点
请求
字段组成:

"timestamp"              "site"   "requests"
"2015-03-16T00:09:55"   "mobile"    1595
"2015-03-16T00:10:39"   "mobile"    1544
"2015-03-16T00:19:39"   "desktop"   2460
我希望第一行消失,因为它会导致我必须对数据执行的操作出错

我试着用以下方法来做:

1.在拆分RDD之前对其进行筛选

val RDD1 = sc.textFile("pageviews_by_second")       
val top_row = RDD1.first() 
//returns: top_row: String = "timestamp"    "site"  "requests"    
val RDD2 = RDD1.filter(x => x!= top_row)
RDD2.first() 
//returns: "2015-03-16T00:09:55"    "mobile"    1595
2.拆分RDD后过滤RDD

val RDD1 = sc.textFile("pageviews_by_second").map(_.split("\t")
RDD1.first()  //returns res0: Array[String] = Array("timestamp, 'site", "requests")
val top_row = RDD1.first()
val RDD2 = RDD1.filter(x => x!= top_row)
RDD2.first() //returns: res1: Array[String] = Array("timestamp", "site" ,"requests")
val RDD2 = RDD1.filter(x => x(0)!="timestamp" && x(1)!="site" && x(2)!="requests")
 RDD2.first() //returns: res1: Array[String] = Array("timestamp", "site" ,"requests")
3.使用“案例类”转换为数据帧并对其进行过滤

case class Wiki(timestamp: String, site: String, requests: String)
val DF = sc.textFile("pageviews_by_second").map(_.split("\t")).map(w => Wiki(w(0), w(1), w(2))).toDF()
val top_row = DF.first()
//returns: top_row: org.apache.spark.sql.Row = ["timestamp","site","requests"]
DF.filter(_ => _ != top_row)
//returns: error: missing parameter type
val DF2 = DF.filter(_ => _ != top_row2)

为什么只有第一个方法能够过滤掉第一行,而其他两个不能?在方法3中,为什么会出现错误以及如何纠正错误?

在删除顶行时,首先需要了解要比较的数据类型

在方法1中,比较两个字符串将得到true或false。因此,它会过滤掉最上面一行

在方法2中,您将比较2个数组。使用数组的
deep
method对scala中的数组进行更深入的比较

Method2
val RDD1 = sc.textFile("D:\\trial.txt").map(_.split("\t"))
val top_row = RDD1.first()
val RDD2 = RDD1.filter(x => x.deep!= top_row.deep)
RDD2.first().foreach(println(_))
在方法3中,比较dataframe的两行对象。最好将行转换为
toSeq
,然后再转换为
toArray
,然后使用
deep
方法过滤掉数据帧的第一行

//Method 3    
DF.filter(_ => _.toSeq.toArray.deep!=top_row.toSeq.toArray.deep)

如果有帮助,请回复。谢谢

首先,您真的应该使用
spark csv
-包-它可以在创建
DataFrame
(或
rdd
)时自动过滤出标题。您只需指定:)

其次,
rdd
的排序方式并不像您想象的那样。调用
first
不能保证返回csv文件的第一行。这是你的第一个场景,很明显,你获得了第一排,但如果你认为自己在这种情况下很幸运,那就更好了。此外,从一个可能非常大的数据集中删除这样的头是非常低效的,因为Spark将需要搜索所有的行以过滤掉一行


如果订购对进一步计算很重要,则始终可以执行
zipWithIndex
。通过这种方式,您可以对
rdd
进行排序以保持顺序。

有一种方法可以删除标题,而不是进行深度比较:

data=sc.textFile('path\u to\u data')
header=data.first()#提取header
数据=数据.过滤器(λx:x!=标题)#过滤出标题

可能与您相关:

我找到了另一种比我使用的过滤方法更有效的方法。将其作为答案发布,其他人可能会发现它很有用:

rdd.mapPartitionsWithIndex { (idx, iter) => if (idx == 0) iter.drop(1) else iter }

来源:

谢谢你的回答。是否有其他方法来进行比较,而不是使用
deep
?像一些指数比较?这可能会有帮助,谢谢Glennie,我知道
first()
方法不一定是第一个,我在那里很幸运,我不想使用
spark csv
软件包,因为我只是在学习,想从头开始编写代码。但是使用
spark csv
如何在使用
过滤器()时不影响效率?在引擎盖下,
spark csv
必须执行类似的操作,不是吗?我还没有读过代码,但我想
spark csv
只是省略了第一行,当它将数据导入
rdd
:)此外,我不确定我是否完全理解代码的内容-学习spark是,IMHO,所有关于学习Spark库以及如何使用它们的内容。顺便说一句,使用Spark csv只意味着你要编写
sqlContext.read.format(“com.databricks.Spark.csv”)。选项(“header”、“true”)。加载(myFile)
,而不是
sc.textFile(myFile)。映射(u.split(\t”)
谢谢你的帮助,但这正是我所做的。你的代码是PySparkYou应该向上投票的,因为你得到了正确的参考来找到你的有效答案。