Apache spark 过滤数据帧最有效的方法是什么

Apache spark 过滤数据帧最有效的方法是什么,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,。。。通过检查列的值是否在seq中。 也许我没有很好地解释它,我基本上想用seq中的常规SQL:DF_列来表达它 首先,我使用一个广播变量,在这里我放置了seq,UDF,用于检查和registerTempTable。 问题是,我没有对它进行测试,因为我遇到了一个很明显只有在使用带有ScalaIDE的RegisterEmptable时才会出现的问题 我最终用seq创建了一个新的数据框架,并用它进行了内部连接,但我怀疑这是完成任务最有效的方式 谢谢 编辑:回应@YijieShen: 如何根据一个数据

。。。通过检查列的值是否在seq中。 也许我没有很好地解释它,我基本上想用seq中的常规SQL:DF_列来表达它

首先,我使用一个广播变量,在这里我放置了seq,UDF,用于检查和registerTempTable。 问题是,我没有对它进行测试,因为我遇到了一个很明显只有在使用带有ScalaIDE的RegisterEmptable时才会出现的问题

我最终用seq创建了一个新的数据框架,并用它进行了内部连接,但我怀疑这是完成任务最有效的方式

谢谢

编辑:回应@YijieShen: 如何根据一个数据帧列的元素是否在另一个DF列中进行筛选,如SQL select*from A where login in select username from B

例如: 第一个DF:

login      count
login1     192  
login2     146  
login3     72   
第二个DF:

username
login2
login3
login4
结果是:

login      count
login2     146  
login3     72   
尝试: 编辑2:我认为,既然bug已经修复,这些应该可以工作了。结束编辑-2

它们分别在线程主org.apache.spark.sql.AnalysisException中引发异常:

resolved attribute(s) username#10 missing from login#8 in operator 
!Filter Contains(login#8, username#10);

第一种方法描述后的代码在Spark 1.4.0-SNAPSHOT中正常运行,这两种配置如下:

Intellij IDEA测试 Spark独立群集具有8个节点1个主节点,7个工作节点 请检查是否存在任何差异

val bc=sc.broadcastArray[String]login3,login4 val x=Arraylogin1,192,login2,146,login3,72 val xdf=sqlContext.createDataFramex.toDFname,cnt val func:String=>Boolean=arg:String=>bc.value.containsarg val sqlfunc=udffunc val filtered=xdf.filtersqlfunccolname xdf.show 过滤节目 输出

名称cnt 后勤192 login2 146 登录3 72

名称cnt 登录3 72

你应该广播一个集合,而不是一个数组,比线性搜索快得多

您可以让Eclipse运行您的Spark应用程序。以下是方法:

正如邮件列表中指出的,spark sql假定其类由原始类加载器加载。Eclipse中的情况并非如此,Java和Scala库是作为引导类路径的一部分加载的,而用户代码及其依赖项在另一个引导类路径中。您可以在“启动配置”对话框中轻松解决此问题:

从引导条目中删除Scala库和Scala编译器 将scala反射、scala库和scala编译器作为外部JAR添加到用户条目中。 该对话框应如下所示:

编辑:已修复,并且自v以来不再需要此解决方案。1.4.0


Seq的大小大概是多少?很小,目前有100个元素,而且永远不会超过10k。用dataFrame的DSL代替sql怎么样?@YijieShen请看编辑。谢谢。@MarkoBonaci,您使用的是哪种版本的spark?[spark-5281]是否也会影响您的版本?或者仅仅因为您使用的ScalaIDE导致第一次尝试失败?我使用的是1.3.1。我还可以在除ScalaIDE之外的所有环境中运行它。我刚刚尝试了您的代码,碰巧在后台运行了与使用sql expresson时相同的代码。从理念上讲,它运行良好。那么,我们是否得出结论,鉴于这个bug,ScalaIDE中唯一可能的选择是进行内部连接?或者你有其他的想法?@MarkoBonaci,或者你可以转移到想法,忘记错误::好吧,这是我正在写的一本书中的一个例子的一部分。但是,我只是在想也许这毕竟不是件坏事。这可能就像现实生活中的情况,你被迫处理一个路障,并找到另一个解决方案。从这个角度来看,算法不烂也没那么重要,我想,备选方案一定很烂,哪怕只是一点点:你介意你成为书中的一个角色,像配角一样——从某个角度说,是个好撒玛利亚人吗?顺便说一句,这对曼宁来说是一个闪光点。@MarkoBonaci,只是认为广播变量和udf更适合您的需求,尽管有时必须解决这个问题。不,我不介意:@YijieShen我在筛选器内执行udf时出错..就像找到ColName必需字符串`val DS_in=DS_in.filter$cid==2.joints_B,Seqcid,aid,internal.filtercompareUsage$usagetype`my udf val compareUsage:String=>Boolean=str:String=>if str==| str==null{true}否则,如果str.toString.toUpperCase.ContainesCitve | | str.toString.toUpperCase包含用法true或false,您能告诉我哪里出了问题吗
ordered.select("login").filter($"login" in empLogins("username"))
resolved attribute(s) username#10 missing from login#8 in operator 
!Filter Contains(login#8, username#10);
resolved attribute(s) username#10 missing from login#8 in operator 
!Filter login#8 IN (username#10);