我想要一個json文件並將其映射爲使其中一列是另一列的子字符串。例如採取左表併產生右表:在火花數據框中創建子字符串列
------------ ------------------------
| a | | a | b |
|------------| -> |------------|---------|
|hello, world| |hello, world| hello |
我可以做到這一點使用火花SQL語法,但它如何使用內置函數來完成?
我想要一個json文件並將其映射爲使其中一列是另一列的子字符串。例如採取左表併產生右表:在火花數據框中創建子字符串列
------------ ------------------------
| a | | a | b |
|------------| -> |------------|---------|
|hello, world| |hello, world| hello |
我可以做到這一點使用火花SQL語法,但它如何使用內置函數來完成?
這樣的語句可以用來
import org.apache.spark.sql.functions._
dataFrame.select(col("a"), substring_index(col("a"), ",", 1).as("b"))
你會使用withColumn
功能
import org.apache.spark.sql.functions.{ udf, col }
def substringFn(str: String) = your substring code
val substring = udf(substringFn _)
dataframe.withColumn("b", substring(col("a"))
UDF很糟糕,因爲根據您在其中執行的操作,查詢計劃程序/優化程序可能無法「看透」它。 –
@JonWatte這是一個很好的觀點。請記住,在某些情況下,Spark提供的函數是不夠的,例如:將long/lat列轉換爲geohash。 – soote
假設你有以下數據框:
import spark.implicits._
import org.apache.spark.sql.functions._
var df = sc.parallelize(Seq(("foobar", "foo"))).toDF("a", "b")
+------+---+
| a| b|
+------+---+
|foobar|foo|
+------+---+
你可以從第一塔子集的新列如下:
df = df.select(col("*"), substring(col("a"), 4, 6).as("c"))
+------+---+---+
| a| b| c|
+------+---+---+
|foobar|foo|bar|
+------+---+---+
威爾列由逗號分隔的一個永遠是兩個詞?列b總是第一個單詞? – soote
否和否,理想情況下,解決方案應對列a值運行子字符串函數以生成列b –