【问题标题】:How do I convert a WrappedArray column in spark dataframe to Strings?如何将 Spark 数据框中的 WrappedArray 列转换为字符串?
【发布时间】:2016-04-04 23:47:35
【问题描述】:

我正在尝试将包含 Array[String] 的列转换为 String,但我一直收到此错误

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 78.0 failed 4 times, most recent failure: Lost task 0.3 in stage 78.0 (TID 1691, ip-******): java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String; 

这是一段代码

val mkString = udf((arrayCol:Array[String])=>arrayCol.mkString(","))  
val dfWithString=df.select($"arrayCol").withColumn("arrayString",
      mkString($"arrayCol"))  

【问题讨论】:

    标签: scala apache-spark dataframe apache-spark-sql user-defined-functions


    【解决方案1】:

    WrappedArray 不是 Array (这是普通的旧 Java Array 不是原生 Scala 集合)。您可以将签名更改为:

    import scala.collection.mutable.WrappedArray
    
    (arrayCol: WrappedArray[String]) => arrayCol.mkString(",")
    

    或使用像Seq这样的超类型之一:

    (arrayCol: Seq[String]) => arrayCol.mkString(",")
    

    在最近的 Spark 版本中,您可以改用 concat_ws

    import org.apache.spark.sql.functions.concat_ws
    
    df.select(concat_ws(",", $"arrayCol"))
    

    【讨论】:

    • 我尝试使用 WrappedArray 但该类型未被识别。 Seq 工作正常
    【解决方案2】:

    代码对我有用:

    df.select("wifi_ids").rdd.map(row =>row.get(0).asInstanceOf[WrappedArray[WrappedArray[String]]].toSeq.map(x=>x.toSeq.apply(0)))
    

    在你的情况下,我猜是:

    val mkString = udf(arrayCol=>arrayCol.asInstanceOf[WrappedArray[String]].toArray.mkString(","))  
    val dfWithString=df.select($"arrayCol").withColumn("arrayString",mkString($"arrayCol"))  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2017-06-13
      • 2019-07-25
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多