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 数据框中对行的每个子集进行映射操作