![](/img/trans.png)
[英]How to convert a string of coma separated characters to a string of strings with each string in single quotes and separated by comma
[英]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.