2017-03-15 68 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| 
+------+---+---+ 
相关问题