簡體   English   中英

spark scala:將DataFrame OR Dataset轉換為單個逗號分隔的字符串

[英]spark scala : Convert DataFrame OR Dataset to single comma separated string

下面是spark scala代碼,它將打印一列DataSet [Row]:

import org.apache.spark.sql.{Dataset, Row, SparkSession}
val spark: SparkSession = SparkSession.builder()
        .appName("Spark DataValidation")
        .config("SPARK_MAJOR_VERSION", "2").enableHiveSupport()
        .getOrCreate()

val kafkaPath:String="hdfs:///landing/APPLICATION/*"
val targetPath:String="hdfs://datacompare/3"
val pk:String = "APPLICATION_ID" 
val pkValues = spark
        .read
        .json(kafkaPath)
        .select("message.data.*")
        .select(pk)
        .distinct() 
pkValues.show()

關於代碼的輸出:

+--------------+
|APPLICATION_ID|
+--------------+
|           388|
|           447|
|           346|
|           861|
|           361|
|           557|
|           482|
|           518|
|           432|
|           422|
|           533|
|           733|
|           472|
|           457|
|           387|
|           394|
|           786|
|           458|
+--------------+

題 :

如何將此數據幀轉換為逗號分隔的String變量?

預期產量:

val   data:String= "388,447,346,861,361,557,482,518,432,422,533,733,472,457,387,394,786,458"

請建議如何將DataFrame [Row]或Dataset轉換為一個String。

我認為這不是一個好主意,因為dataFrame是一個分布式對象並且可以是無關緊要的。 Collect會將所有數據都帶給驅動程序,因此您應該仔細執行此類操作。

您可以使用dataFrame(兩個選項)執行以下操作:

df.select("APPLICATION_ID").rdd.map(r => r(0)).collect.mkString(",")
df.select("APPLICATION_ID").collect.mkString(",")

測試dataFrame只有3行的結果:

String = 388,447,346

編輯:使用DataSet,您可以直接執行:

ds.collect.mkString(",")

使用collect_list:

import org.apache.spark.sql.functions._
val data = pkValues.select(collect_list(col(pk))) // collect to one row
    .as[Array[Long]] // set encoder, so you will have strongly-typed Dataset
    .take(1)(0) // get the first row - result will be Array[Long]
    .mkString(",") // and join all values

但是,執行收集或占用所有行是一個非常糟糕的主意。 相反,你可能想用.write保存pkValues? 或者使其成為其他函數的參數,以保持分布式計算

編輯:剛注意到,@SCouto在我之后發布了其他答案。 收集也是正確的,使用collect_list函數你有一個好處 - 如果你願意,你可以很容易地進行分組,即將組鍵分組為偶數和奇數組。 這取決於您喜歡哪種解決方案,更簡單的收集或更長的一行,但更強大

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM