python - 如何在 Spark 数据框中添加具有序列值的列?
问题描述
如何从 PySpark 数据框中的特定数字添加具有序列值的列?
当前数据集:
Col1 Col2 Flag
Val1 Val2 F
Val3 Val4 T
但我希望数据集是这样的:
Col1 Col2 Flag New_Col
Val1 Val2 F 11F
Val3 Val4 T 12T
我在 Python 中使用下面的代码。
from pyspark.sql import functions as F
from pyspark.sql import types as T
seq = 10
def fn_increment_id(flag):
global seq
seq += 1
return str(seq) + flag
if __name__ == "__main__":
df = spark.loadFromMapRDB("path/to/table")
my_udf = F.UserDefinedFunction(fn_increment_id, T.StringType())
df = df.withColumn("New_Col", my_udf("Flag"))
print(df.show(10))
但是,我最终得到了结果:
Received Dataset:
Col1 Col2 Flag New_Col
Val1 Val2 F 11F
Val3 Val4 T 11T
因此,它为所有行增加一次。如何增加每一行?提前致谢。
解决方案
可以使用 . 添加具有顺序值的列Window
。只要数据框不太大,这很好,对于较大的数据框,您应该考虑partitionBy
在窗口上使用,但值不会是连续的。
下面的代码为每一行创建序列号,将 10 添加到它,然后将值与Flag
列连接以创建一个新列。这里的行排序,Col1
但可以使用任何列。
from pyspark.sql.window import Window
from pyspark.sql.functions import col, row_number, concat
w = Window().orderBy("Col1")
df = df.withColumn("New_Col", concat(row_number().over(w) + 10, col(Flag)))
推荐阅读
- microprocessors - 如何将 8085 代码转换为 z80 程序集
- javascript - Angular Unit-Test MockService 仍然抛出无法读取未定义的属性“订阅”
- html - 将数据从网站抓取到 Excel 中......但在登录之后
- javascript - 我正在研究 flightradar 24 示例并得到 json decode 错误
- abp - 实体框架:访问/调试 SQL
- java - 为什么我的模型类中的 int 返回 null
- firebase - Flutter Firestore 检索和设置嵌套对象
- python - 在无头 Chrome 中下载文件,(python)
- d3.js - 如何让热图中每个元素的文本与 y 轴标签相同?
- javascript - 在控制台中出现错误无法绑定到“ngif”,因为它不是角度应用程序中“div”的已知属性