2017-03-15 102 views
2

我想要一個json文件並將其映射爲使其中一列是另一列的子字符串。例如採取左表併產生右表:在火花數據框中創建子字符串列

------------    ------------------------ 
|  a  |    |  a  | b | 
|------------|  -> |------------|---------| 
|hello, world|    |hello, world| hello | 

我可以做到這一點使用火花SQL語法,但它如何使用內置函數來完成?

+0

威爾列由逗號分隔的一個永遠是兩個詞?列b總是第一個單詞? – soote

+0

否和否,理想情況下,解決方案應對列a值運行子字符串函數以生成列b –

回答

4

這樣的語句可以用來

import org.apache.spark.sql.functions._ 

dataFrame.select(col("a"), substring_index(col("a"), ",", 1).as("b"))

3

你會使用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")) 
+1

UDF很糟糕,因爲根據您在其中執行的操作,查詢計劃程序/優化程序可能無法「看透」它。 –

+0

@JonWatte這是一個很好的觀點。請記住,在某些情況下,Spark提供的函數是不夠的,例如:將long/lat列轉換爲geohash。 – soote

1

假設你有以下數據框:

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| 
+------+---+---+ 
相關問題