我有資料框 df
| name| languagesAtSchool|currentState|
---------------- ------------------ ------------
| James,,Smith|[Java, Scala, C ]| CA|
| Michael,Rose,|[Spark, Java, C ]| NJ|
|Robert,,Williams| [CSharp, VB, R]| NV|
---------------- ------------------ ------------
我想要
---------------- -------- -----
|Name |language|State|
---------------- -------- -----
|James,,Smith |Java |CA |
|James,,Smith |Scala |CA |
|James,,Smith |C |CA |
|Michael,Rose, |Spark |NJ |
|Michael,Rose, |Java |NJ |
|Michael,Rose, |C |NJ |
|Robert,,Williams|CSharp |NV |
|Robert,,Williams|VB |NV |
|Robert,,Williams|R |NV |
---------------- -------- -----
我已經嘗試了下面的完美作品
val df2=df.flatMap(f=> f.getSeq[String](1).map((f.getString(0),_,f.getString(2))))
.toDF("Name","language","State")
但我希望在不指定其他列的情況下可以正常作業,因此我嘗試了
val df2 = df.withColumn("laguage", df.flatMap(f=>f.getSeq[String](1)))
然后它給
Unknown Error: <console>:40: error: missing parameter type
val df3 = df.withColumn("laguage", df.flatMap(f=>f.getSeq[String](1)))
^
因此,我希望 Spark 中的某些內容可以在不丟棄其他列的情況下轉換列。我猜原因是scala無法確定型別,但我無法修復它。我是 Scala 的新手,感謝您的幫助!
uj5u.com熱心網友回復:
您正在尋找的方法是explode:
def expand(e: Column): Column 為給定陣列或映射列中的每個元素創建一個新行。除非另有說明,否則對陣列中的元素使用默認列名 col,對映射中的元素使用鍵和值。從 1.3.0 開始
df.withColumn("language", explode(col("language"))
uj5u.com熱心網友回復:
explode 正是針對這種情況 - 它拆分了一個陣列列,因此串列中的每個元素都將位于單獨的行中。
這是一個帶有輸出的完整示例:
package org.example
import org.apache.spark.sql._
import org.apache.spark.sql.functions.{col, explode}
import org.apache.spark.sql.types.{ArrayType, StringType, StructType}
object App {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().appName("test").master("local[*]").getOrCreate()
import spark.implicits._
// create dataframe with test data
val data = Seq(
Row("James,,Smith", List("java", "scala"), "ca"),
Row("Robert,,Williams", List("c", "c "), "nv")
)
val schema = new StructType()
.add("name", StringType)
.add("languages", ArrayType(StringType))
.add("current_state", StringType)
val df = spark.createDataFrame(spark.sparkContext.parallelize(data), schema)
df.show(false)
// ---------------- ------------- -------------
// |name |languages |current_state|
// ---------------- ------------- -------------
// |James,,Smith |[java, scala]|ca |
// |Robert,,Williams|[c, c ] |nv |
// ---------------- ------------- -------------
// use explode to split the array values into different rows
df.withColumn("language", explode(col("languages"))).drop("languages").show()
// ---------------- ------------- --------
// | name|current_state|language|
// ---------------- ------------- --------
// | James,,Smith| ca| java|
// | James,,Smith| ca| scala|
// |Robert,,Williams| nv| c|
// |Robert,,Williams| nv| c |
// ---------------- ------------- --------
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/312779.html
