2017-08-26 285 views
0

使用Spark 2.1(在Databricks上),我有一個表格,它有一個類型爲String的列作爲從.CSV文件導入的結果。在針對該表的SELECT查詢中,我試圖在數學運算中使用列值之前將該列的值轉換爲Integer。我一直無法找到正確的Spark SQL「函數」來執行此操作。如何將字符串值轉換(或轉換)爲整數值?

下面是一個SQL的例子。 「TO_NUMBER」對兩個字符串中的任何一個都不起作用; Sum_GN_POP或Count1:

SELECT name AS geohashPrefix3, TO_NUMBER(Sum_GN_POP) AS totalPopulation, TO_NUMBER(Count1) AS landMass 
    FROM wayne_geohash3 
    WHERE (LENGTH(name) = 3) 

如果我能找到相關文檔,這將會有所幫助。我也想用其他類型進行其他類型的轉換(或轉換)。任何一方或雙方的任何指導都將不勝感激。

+0

我會建議使用udf來解析.... –

回答

2

總結:
阿帕奇Spark's SQL具有Apache Hive部分相容。因此,大多數可以用Hive編寫的SQL都可以用Spark SQL編寫。

詳情:
將字符串轉換爲特定數值類型等INT,可以使用流延。該演員包括用圓括號包圍目標,並在括號之前添加要更改的類型。例如,中投可能是這樣的:

INT(someStringValue) 

因此,爲了在原貼問題的工作的SQL,它需要被改變,看起來像這樣(用「取代了原來的功能命名爲「TO_NUMBER」 INT「):

SELECT name AS geohashPrefix3, INT(Sum_GN_POP) AS totalPopulation, INT(Count1) AS landMass 
    FROM wayne_geohash3 
WHERE (LENGTH(name) = 3) 
2

您可以使用選項則InferSchema像這樣把它作爲Integercsv文件:

val df = spark.read.option("inferSchema", true).csv("file-location") 

這就是說:inferSchema選項有時會犯錯,並將類型設置爲String。如果是的話,你可以使用cast操作上Column

據幀/數據集Implemetation:

val df2 = df.withColumn("Count1", $"Count1" cast "Int" as "landMass").withColumn("Count1", $"Sum_GN_POP" cast "Int" as "totalPopulation") 

SQL Implemetation:

SELECT name AS geohashPrefix3, CAST(Sum_GN_POP as INT) AS totalPopulation, CAST(Count1 AS INT) AS landMass 
    FROM wayne_geohash3 
    WHERE (LENGTH(name) = 3) 
+0

我還沒有準備好這麼做。正確答案不完整。我的回答是我最初試圖找到的。我仍然無法確定我的答案是否真的是演員或其他人。 – chaotic3quilibrium

1

我會使用UDF它,因爲火花的演職人員將不捕獲變量溢出:

val parseInt = udf((s:String) => scala.util.Try{Some(s.toInt)}.getOrElse(None)) 

Seq("100", "10000000000", "1x0") 
    .toDF("i") 
    .select(
    $"i" cast "int" as "casted_result", 
    parseInt($"i") as "udf_result" 
).show 

+-------------+----------+ 
|casted_result|udf_result| 
+-------------+----------+ 
|   100|  100| 
| 1410065408|  null| 
|   null|  null| 
+-------------+----------+ 
+0

這對於Spark SQL線索來說太過分了,因爲我已經知道列值已受到約束,因此在拋出查詢時進行了簡單的字符串到Int轉換。然而,當我需要這樣的防範時,你的答案仍然很有價值。 – chaotic3quilibrium