2015-09-15 38 views
3

我有一个数据框星火,那里的领域之一是地图类型的....我可以获取任何地图类型字段的键的数据,但我不能这样做时,我申请一个过滤器的特定键的特定值...如何筛选火花的MapType场数据帧

val line = List (("Sanjay", Map("one" -> 1, "two" -> 2)), ("Taru", Map("one" -> 10, "two" -> 20))) 

我创建上面所列内容&的RDD & DF我试图在DF获取,地图值,其中值,如果> = 5 .... 。但我在Spark Repl中得到了以下例外。请帮助

val rowrddDFFinal = rowrddDF.select(rowrddDF("data.one").alias("data")).filter(rowrddDF("data.one").geq(5)) 

org.apache.spark.sql.AnalysisException:解析属性(一个或多个)数据#1 想着 // | g来自运算符中的数据#3过滤器(数据#1 [one] AS one#4> = 5); // |在org.apache.spark.sql.catalyst.analysis.CheckAnalysis $ class.failAnalys // |是(CheckAnalysis.scala:38) // |在org.apache.spark.sql.catalyst.analysis.Analyzer.failAnalysis(分析器 // | .scala:42) // | at org.apache.spark.sql.catalyst.analysis.CheckAnalysis $$ anonfun $ checkAn // |分析$ 1.apply(CheckAnalysis.scala:121) // | at org.apache.spark.sql.catalyst.analysis.CheckAnalysis $$ anonfun $ checkAn // |分析$ 1.apply(CheckAnalysis.scala:50) // |在org.apache.spark.sql.catalyst.trees.TreeNode.foreachUp(TreeNode.scala // |:98) // |在org.apache.spark.sql.catalyst.analysis.CheckAnalysis $ class.checkAnaly // | sis(CheckAnalysis.scala:50) // |在org.apache.spark.sql.catalyst.analysis.Analyzer.checkAnalysis(分析 // | r.scala:42) // |在org.apache.spark.sql.SQLContext $ QueryExecution.assertAnalyzed(SQLCont // | ext.scala:931)

回答

8

要从ArrayMap列访问值,您可以使用Column.getItem方法:

rowrddDF 
.where($"data".getItem("one").geq(5)) 
.select($"data".getItem("one").alias("data")) 

如果你喜欢filter之后select你不能再使用rowrddDF.apply。相反,你应该直接访问别名列:

df 
    .select($"data".getItem("one").alias("data")) 
    .filter($"data".geq(5)) 
+0

我做了如下....年推荐运作良好。 ' VAL lastrddDFF = rowrddDF.select(rowrddDF( “数据”)。的getItem( “1”)。别名( “数据”))。其中,(COL( “数据”)。GEQ(5)) ' 谢谢 – sshroff