开发者社区> 问答> 正文

展平spark 数据框的列值并将其放入变量中

社区小助手 2018-12-06 15:50:38 479

Spark version 1.60,scala version 2.10.5。

我有这样的spark-sql数据帧df,

addessattributes
1314 44 AvenueTours, Mechanics, Shopping
115 25th AveRestaurant, 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来展平它们后得到唯一的值。

如何获得所需的输出?

分布式计算 Scala Spark
分享到
取消 提交回答
全部回答(1)
  • 社区小助手
    2019-07-17 23:18:36

    我强烈建议你使用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)

    0 0
+ 订阅

大数据计算实践乐园,近距离学习前沿技术

推荐文章
相似问题
推荐课程