簡體   English   中英

將Spark數據幀的Map列的映射數組轉儲到CSV文件中

[英]Dump array of map column of a spark dataframe into csv file

我有以下火花數據框及其對應的架構

+----+--------------------+
|name|        subject_list|
+----+--------------------+
| Tom|[[Math -> 99], [P...|
| Amy|   [[Physics -> 77]]|
+----+--------------------+

root
 |-- name: string (nullable = true)
 |-- subject_list: array (nullable = true)
 |    |-- element: map (containsNull = true)
 |    |    |-- key: string
 |    |    |-- value: integer (valueContainsNull = false)

我如何將這個數據幀轉儲到由“ \\ t”分隔的csv文件中,如下所示

Tom    [(Math, 99), (Physics, 88)]
Amy    [(Physics, 77)]

這是指向該問題的類似帖子的鏈接 ,但它用於轉儲字符串數組而不是map數組。

感謝您的幫助,謝謝。

引發錯誤和其他詳細信息的原因在您共享的同一鏈接中列出。 這是stringify數組的stringify的修改版本:

def stringify = udf((vs: Seq[Map[String, Int]]) => vs match {
  case null => null
  case x => "[" + x.flatMap(_.toList).mkString(",") + "]"
})

學分: 鏈接

您可以編寫udf以將Map轉換為string如您所願

val mapToString = udf((marks: Map[String, String]) => {
  marks.map{case (k, v) => (s"(${k},${v})")}.mkString("[",",", "]")
})

dff.withColumn("marks", mapToString($"marks"))
  .write.option("delimiter", "\t")
  .csv("csvoutput")

輸出:

Tom [(Math,99),(Physics,88)]
Amy [(Physics,77)]

但我不建議您這樣做,您在再次閱讀並必須手動解析時會遇到問題,最好將這些地圖展平為

dff.select($"name", explode($"marks")).write.csv("csvNewoutput")

將存儲為

Tom,Math,99
Tom,Physics,88
Amy,Physics,77

暫無
暫無

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

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