簡體   English   中英

如何在 Spark Scala 中將列數據類型轉換為字符串?

[英]How do I convert a Column DataType to String in Spark Scala?

我正在嘗試調用 from_json 方法並希望動態獲取 JSON 的模式。 問題在於 third.withColumn 行,因為它似乎不喜歡 Seq[Column]。

val randomStringGen = udf((length: Int) => {
scala.util.Random.alphanumeric.take(length).mkString
})

val randomKeyGen = udf((key: String, value: String) => {
s"""{"${key}": "${value}"}"""
})

val resultDF = initDF
.withColumn("value", randomStringGen(lit(10)))
.withColumn("keyValue", randomKeyGen(lit("key"), col("value")))
.withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(col("keyValue")).toDS).schema))

錯誤:值 toDS 不是 Seq[org.apache.spark.sql.Column].withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(col("keyValue" )).toDS).模式))

我有一個已知的解決方案,它只是對示例 JSON 進行硬編碼:

val jsData = """{"key": "value"}"""

並將 col("keyValue") 替換為硬編碼變量。

.withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(jsData).toDS).schema))

這有效並產生了我想要的結果,但如果我有一個大的 json,那么這種方法可能會非常麻煩。

你寫的有兩個小錯誤。

首先,如果你想在Seq上使用toDS方法,你需要import spark.implicits._ 這個方法在那里定義。 這樣做應該可以消除您的第一個錯誤。

其次,您嘗試使用的from_json function 具有以下 function 簽名:

def from_json(e: Column, schema: StructType): Column

所以第二個字段schema應該是一個 StructType。 這是 Dataset 的.schema方法返回的內容。 所以,你的括號之一是錯誤的 position。

代替

.withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(col("keyValue")).toDS.schema)))

你應該有

.withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(col("keyValue")).toDS).schema))

暫無
暫無

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

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