scala 在spark Dataframe 中创建子字符串列

xzv2uavs  于 2023-03-18  发布在  Scala
关注(0)|答案(6)|浏览(176)

我想获取一个json文件并Map它,使其中一列成为另一列的子串,例如获取左表并生成右表:

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

我可以使用spark-sql语法来实现这一点,但是如何使用内置函数来实现呢?

u3r8eeie

u3r8eeie1#

这样的语句可用于

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

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

xlpyo6sf

xlpyo6sf2#

假设您有以下 Dataframe :

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|
+------+---+---+
dba5bblo

dba5bblo3#

可以使用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"))
b5lpy0ml

b5lpy0ml4#

只是为了丰富现有的答案。如果你对字符串列的正确部分感兴趣的话。那就是:

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

应该使用负索引:

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

tjrkku2a5#

您可以使用pyspark的方法来完成,如以下示例所示:

df.withColumn('New_col', df['Old_col'].substr(0, 7)).show()
piah890a

piah890a6#

如果你想从字符串的开头得到子字符串,那么从0开始计算它们的索引,其中字母'h'有第7个索引,字母'o'有第11个索引:

from pyspark.sql.functions import substring
df = df.withColumn('b', col('a').substr(7, 11))

如果你想在一列中得到最后5个字符串和长度等于5单词'hello',那么用途:

df = df.withColumn('b', col('a').substr(-5,5))

相关问题