Spark version 1.60,scala version 2.10.5。
我有这样的spark-sql数据帧df,
addess | attributes |
---|---|
1314 44 Avenue | Tours, Mechanics, Shopping |
115 25th Ave | Restaurant, Mechanics, Brewery |
从这个数据框架,我想要如下的价值,
Tours, Mechanics, Shopping, Brewery
如果我这样做,
df.select(df("attributes")).collect().foreach(println)
我明白了
[Tours, Mechanics, Shopping]
[Restaurant, Mechanics, Brewery]
我以为我可以使用flatMap而不是发现这个,所以,试着把它变成一个变量使用,
val allValues = df.withColumn(df("attributes"), explode("attributes"))
但我收到一个错误:
错误:类型不匹配;
发现:org.apache.spark.sql.column
要求:字符串
我在想是否可以获得输出,explode我可以使用它distinct来展平它们后得到唯一的值。
如何获得所需的输出?
我强烈建议你使用spark 2.x版本。在Cloudera中,当您发出“spark-shell”时,它会启动1.6.x版本..但是,如果您发出“spark2-shell”,则会获得2.x shell。请咨询您的管理员
但是如果您需要使用Spark 1.6和rdd解决方案,请试试这个。
import spark.implicits._
import scala.collection.mutable._
val df = Seq(("1314 44 Avenue",Array("Tours", "Mechanics", "Shopping")),
("115 25th Ave",Array("Restaurant", "Mechanics", "Brewery"))).toDF("address","attributes")
df.rdd.flatMap( x => x.getAs[mutable.WrappedArray[String]]("attributes") ).distinct().collect.foreach(println)
结果:
Brewery
Shopping
Mechanics
Restaurant
Tours
如果“属性”列不是数组,而是以逗号分隔的字符串,则使用下面的列,它会给出相同的结果
val df = Seq(("1314 44 Avenue","Tours,Mechanics,Shopping"),
("115 25th Ave","Restaurant,Mechanics,Brewery")).toDF("address","attributes")
df.rdd.flatMap( x => x.getAsString.split(",") ).distinct().collect.foreach(println)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。