Scala 在spark dataframe中创建子字符串列

Scala 在spark dataframe中创建子字符串列,scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我想获取一个json文件并将其映射,以便其中一列是另一列的子字符串。例如,获取左表并生成右表: ------------ ------------------------ | a | | a | b | |------------| -> |------------|---------| |hello, world| |hello, world|

我想获取一个json文件并将其映射,以便其中一列是另一列的子字符串。例如,获取左表并生成右表:

 ------------              ------------------------
|     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”、“子串索引”。此处描述的功能: