我想要一个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 –