Scala 在spark dataframe中创建子字符串列
我想获取一个json文件并将其映射,以便其中一列是另一列的子字符串。例如,获取左表并生成右表:Scala 在spark dataframe中创建子字符串列,scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我想获取一个json文件并将其映射,以便其中一列是另一列的子字符串。例如,获取左表并生成右表: ------------ ------------------------ | a | | a | b | |------------| -> |------------|---------| |hello, world| |hello, world|
------------ ------------------------
| a | | a | b |
|------------| -> |------------|---------|
|hello, world| |hello, world| hello |
我可以使用spark sql语法来实现这一点,但是如何使用内置函数来实现呢 您可以使用
with column
功能
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"))
这样的陈述是可以使用的
import org.apache.spark.sql.functions._
dataFrame。选择(列(“a”)、子字符串索引(列(“a”)、“,”,1)作为(“b”)
假设您有以下数据帧:
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|
+------+---+---+
只是为了丰富现有的答案。以防您对字符串列的右侧部分感兴趣。即:
------------ ------------------------
| a | | a | b |
|------------| -> |------------|---------|
|hello, world| |hello, world| world |
您应该使用负索引:
dataFrame.select(col("a"), substring_index(col("a"), ",", -1).as("b"))
只需使用
pyspark
方式即可,如以下示例所示:
df.withColumn('New_col', df['Old_col'].substr(0, 7)).show()
列a是否总是由逗号分隔的两个单词?b列总是第一个字吗?不,不,理想情况下,解决方案应该在a列的值上运行一个子字符串函数,以生成列BUDF,因为根据您在其中所做的操作,查询计划器/优化器可能无法“看穿”它。@JonWatte这是一个很好的观点。请记住,有些情况下spark提供的函数不够,例如:将long/lat列转换为geohash。您是否有上述代码的语法参考..我无法理解其中的语法部分。谢谢使用火花函数“col”、“子串索引”。此处描述的功能: