簡體   English   中英

Spark將列轉換為存儲在字符串中的SQL類型

[英]Spark cast column to sql type stored in string

簡單的請求是我需要幫助,將一列添加到數據框中,但是該列必須為空,其類型來自... spark.sql.types,並且必須從字符串中定義類型。

我可能可以使用ifs或case做到這一點,但我正在尋找更優雅的東西。 不需要為org.apache.spark.sql.types中的每種類型編寫案例的東西

例如,如果我這樣做:

df = df.withColumn("col_name", lit(null).cast(org.apache.spark.sql.types.StringType))

它可以按預期工作,但是我將類型存儲為字符串,

var the_type = "StringType"

或var the_type =“ org.apache.spark.sql.types.StringType”

而且我無法通過定義字符串的類型來使其正常工作。

對於那些感興趣的人,這里有一些更多細節:我有一個包含元組(col_name,col_type)的集合,它們都作為字符串,並且我需要添加具有正確類型的列,以便將來在兩個數據幀之間進行聯合。

我目前有這個:

for (i <- set_of_col_type_tuples) yield {
    val tip = Class.forName("org.apache.spark.sql.types."+i._2)
    df = df.withColumn(i._1, lit(null).cast(the_type))
    df }

如果我用

val the_type = Class.forName("org.apache.spark.sql.types."+i._2)

我懂了

error: overloaded method value cast with alternatives:   (to: String)org.apache.spark.sql.Column <and>   (to: org.apache.spark.sql.types.DataType)org.apache.spark.sql.Column  cannot be applied to (Class[?0])

如果我用

val the_type = Class.forName("org.apache.spark.sql.types."+i._2).getName()

這是一個字符串,所以我得到:

org.apache.spark.sql.catalyst.parser.ParseException: mismatched input '.' expecting {<EOF>, '('}(line 1, pos 3)
== SQL == org.apache.spark.sql.types.StringType
---^^^

編輯:因此,為了清楚起見,該集合包含這樣的元組(“ col1”,“ IntegerType”),(“ col2”,“ StringType”)而不是(“ col1”,“ int”),(“ col2”, “串”)。 簡單的強制轉換(i._2)不起作用。

謝謝。

您可以使用重載方法cast ,該方法具有String作為參數:

val stringType : String = ...
column.cast(stringType)

def cast(to:String):列

使用該類型的規范字符串表示形式將列轉換為其他數據類型。

您還可以掃描所有數據類型:

val types = classOf[DataTypes]
    .getDeclaredFields()
    .filter(f => java.lang.reflect.Modifier.isStatic(f.getModifiers()))
    .map(f => f.get(new DataTypes()).asInstanceOf[DataType])

現在,類型為Array [DataType]。 您可以將其翻譯為地圖:

val typeMap = types.map(t => (t.getClass.getSimpleName.replace("$", ""), t)).toMap

並在代碼中使用:

column.cast(typeMap(yourType))

暫無
暫無

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

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