我在 a 中有一個列,Dataset[Row]它是 (Scala Spark) 中的結構串列,其中包含欄位id(String) 和score(Double)。我需要將結構串列轉換為原始字串,以便在沒有[括號符號的情況下將其列印出來,括號符號會在列印時自動附加到每個結構和串列的末尾。例如,當我現在列印列時,它看起來像這樣:
[[id1, 0.4], [id2, 0.2], [id3, 0.2], [id4, 0.2]]
但我需要洗掉[串列兩端的 并將,分隔符替換為:(或任何不是 a 的分隔符,)(并保持順序):
id1, 0.4: id2, 0.2: id3, 0.2: id4, 0.2
我嘗試使用該concat_ws方法,但它只接受(array<string> or string). 是否可以將我的結構串列轉換為一個長字串?
uj5u.com熱心網友回復:
試試這個:
import org.apache.spark.sql._
import org.apache.spark.sql.types.{ArrayType, DoubleType, StringType, StructType}
case class ScoreObj(id: String, score: Double)
case class Record(value: String, scores: List[ScoreObj])
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("aaa", List(Row("id1", 0.4), Row("id2", 0.5)))
)
val schema = new StructType()
.add("value", StringType)
.add("scores", ArrayType(new StructType()
.add("id", StringType)
.add("score", DoubleType)))
val df = spark.createDataFrame(spark.sparkContext.parallelize(data), schema)
df.show(false)
// ----- ------------------------
// |value|scores |
// ----- ------------------------
// |aaa |[[id1, 0.4], [id2, 0.5]]|
// ----- ------------------------
// transform the array column into string
df.as[Record].map { case Record(value: String, scores: Seq[ScoreObj]) =>
(value, scores.map { case ScoreObj(id, score) => s"$id, $score" }.mkString(": "))
}.toDF("value", "scores_str").show()
// ----- ------------------
// |value| scores_str|
// ----- ------------------
// | aaa|id1, 0.4: id2, 0.5|
// ----- ------------------
}
}
uj5u.com熱心網友回復:
這是一個解決方案。起始資料集:
df.show(false)
// ------------------------------------------------
// |foo |
// ------------------------------------------------
// |[{id1, 0.4}, {id2, 0.2}, {id3, 0.2}, {id4, 0.2}]|
// ------------------------------------------------
df.printSchema
// root
// |-- foo: array (nullable = false)
// | |-- element: struct (containsNull = false)
// | | |-- id: string (nullable = true)
// | | |-- score: double (nullable = false)
要獲得所需的字串表示形式,請使用transformwithconcat_ws將陣列的每個元素轉換為字串,然后使用 將陣列元素組合為字串array_join:
import org.apache.spark.sql.functions._
df.select(
array_join(
transform(col("foo"), c => concat_ws(", ", c.getField("id"), c.getField("score"))),
": "
) as "foo_str"
).show(false)
// --------------------------------------
// |foo_str |
// --------------------------------------
// |id1, 0.4: id2, 0.2: id3, 0.2: id4, 0.2|
// --------------------------------------
transform(c, f: (Column) => Column)遍歷陣列列的元素c并應用于f每個元素。在這種情況下,f呼叫concat_ws并且由于輸入f是一列結構,我們使用getField("x")來選擇 field 的值x。這會產生一個字串陣列,可以使用 將其連接成單個字串array_join。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311437.html
