Spark - 如何使用列对数据框中的字符串进行切片[重复]

Posted

技术标签:

【中文标题】Spark - 如何使用列对数据框中的字符串进行切片[重复]【英文标题】:Spark - How to slice a string in a dataframe using columns [duplicate] 【发布时间】:2022-01-16 09:48:18 【问题描述】:

我想根据开始和结束位置对数据框列中的字符串进行切片,这也是数据框列。

这是数据框的一部分:

+--------+------+--------------------+
|startPos|endPos|                text|
+--------+------+--------------------+ 
|      12|    30|This is the first...| 
|      50|    82|This is the first...| 
|      15|    27|This is the secon...| 
|      40|    52|This is the secon...| 
|      15|    32|This is the third...|
+--------+------+--------------------+

我试过substring

val slices = df.withColumn("content", substring(col("text"), col("startPos"), col("endPos")))

substring 需要开始和结束整数而不是列。

我也尝试过slice,因为它是 scala 的 StringOps 类的一部分:

val slices = df.withColumn("content", slice(col("text"), col("startPos") col("endPos")))

但它说

无法解析'slice(text, CAST(startPos AS INT), CAST(endPos AS INT))' 由于数据类型不匹配:参数 1 需要数组类型, 但是,'text'是字符串类型的。;

有没有不编码udf的解决方案?

【问题讨论】:

使用expr函数:df.withColumn("content", expr("substring(text, startPos, endPos)")) @blackbishop :谢谢,这就是我要找的。​​span> 【参考方案1】:

你可以发your own UDF:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.types.IntegerType

val dataframe: DataFrame = ???

def slice =
  udf  (content: String, start: Int, end: Int) => content.slice(start, end) 


dataframe
  .withColumn("content", 
    slice(
      col("text"), 
      col("startPos").cast(IntegerType), 
      col("endPos").cast(IntegerType))
  )

【讨论】:

谢谢,但我一直在寻找一种非 udf 方法来优化性能。但也许在新版本的 spark 中不再是 different。

以上是关于Spark - 如何使用列对数据框中的字符串进行切片[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用新列对 Spark dataFrame 中的字符串字段进行 JSON 转义

如何对 Pyspark spark.sql 数据框中的数据进行同质化

使用 NaN 在 pandas 中按列对数据进行 Winsorizing

如何在 PySpark 中的大型 Spark 数据框中对行的每个子集进行映射操作

使用 pyspark 将 Spark 数据框中的列转换为数组 [重复]

可以使用 hbase-spark 连接器按性能良好的列对 hbase 行进行排序吗?