python - 从现有数据框中列的子字符串创建新的 Pyspark 数据框

我有一个如下所示的 Pyspark 数据框,需要创建一个新的数据框,其中只有一列由原始数据框中的所有 7 位数字组成。这些值都是字符串。 Column1 应该被忽略。忽略 Column2 中的非数字和单个 7 位数字非常简单,但对于具有两个单独的 7 位数字的值,我很难将它们单独提取出来。这需要自动化并能够在其他类似的数据帧上运行。这些数字始终为 7 位数字,并且始终以“1”开头。有什么建议吗?

+-----------+--------------------+
|    COLUMN1|             COLUMN2|
+-----------+--------------------+
|     Value1|           Something|
|     Value2|     1057873 1057887|
|     Value3| Something Something|
|     Value4|                null|
|     Value5|             1312039|
|     Value6|     1463451 1463485|
|     Value7|     Not In Database|
|     Value8|     1617275 1617288|
+-----------+--------------------+

生成的数据框应如下所示:

+-------+
|Column1|
+-------+
|1057873|
|1057887|
|1312039|
|1463451|
|1463485|
|1617275|
|1617288|
+-------+
  • 更新:

响应很好,但不幸的是,我使用的是不同意的旧版本 Spark。我用下面的方法解决了这个问题,虽然它有点笨拙......它有效。

from pyspark.sql import functions as F

new_df = df.select(df.COLUMN2)

new_df = new_df.withColumn('splits', F.split(new_df.COLUMN2, ' '))

new_df = new_df.select(F.explode(new_df.splits).alias('column1'))

new_df = new_df.filter(new_df.column1.rlike('\d{7}'))

最佳答案

这是一种用于 spark 2.4+ 的高阶 lambda 函数的方法,其中我们按空格拆分列,然后过滤以 0-9 开头且长度为 n (7) 的单词,然后展开:

n = 7
df.selectExpr(f"""explode(filter(split(COLUMN2,' '),x-> 
            x rlike '^[0-9]+' and length(x)={n})) as COLUMN1""").show(truncate=False)

+-------+
|COLUMN1|
+-------+
|1057873|
|1057887|
|1312039|
|1463451|
|1463485|
|1617275|
|1617288|
+-------+

https://stackoverflow.com/questions/71412759/

相关文章:

r - 识别匹配对并创建一个公共(public) key

reactjs - 如何将主页的页眉和页脚与 react 中的管理页面中的显示分开

apache-kafka - 如何获取 Kafka Debezium MySQL 连接器的 data

spring-boot - 用 vaadin hilla 代替 flow 有什么好处

javascript - 数组方法练习

linux - "No Such Process"消耗GPU显存

c - 幂函数给出的答案与 C 中的 math.pow 函数不同

Flutter - 是否应该将 firebase_options.dart 添加到 gitignor

c - 使用宏从一组给定的不同值中查找不等于任何值的值

javascript - Angular使订阅等待响应