我想用pyspark中旧数据框中的几列更新数据来创建新数据框。
我下面有镶木地板格式的数据框,其中包含uid,name,start_dt,addr,extid等列
df = spark.read.parquet("s3a://testdata?src=ggl")
df1 = df.select("uid")
我必须使用散列的uid和extid在镶木地板中创建一个新的数据框,并包括其余的列。请提出如何做到这一点?我是新来的((
样本输入:
uid, name, start_dt, addr, extid
1124569-2, abc, 12/02/2018, 343 Beach Dr Newyork NY, 889
示例输出:
uid, name, start_dt, addr, extid
a8ghshd345698cd, abc, 12/02/2018, 343 Beach Dr Newyork NY, shhj676ssdhghje
此处uid和extid被sha256散列。
谢谢。
答案 0 :(得分:2)
您可以创建一个UDF函数,该函数调用列上的hashlib.sha256()
并使用withColumn
来转换列。
import pyspark.sql.functions as F
import pyspark.sql.types as T
import hashlib
df = spark.read.parquet("s3a://testdata?src=ggl")
sha256_udf = F.udf(lambda x: hashlib.sha256(str(x).encode('utf-8')).hexdigest(), T.StringType())
df1 = df.withColumn('uid', sha256_udf('uid')).withColumn('extid', sha256_udf('extid'))
df1.show()
答案 1 :(得分:2)
pyspark
已经具有内置功能,可以在sha-256
模块中生成pyspark.sql.functions
。
创建样本数据
from pyspark.sql.functions import sha2
df1 = spark.createDataFrame(
[
Row(
uid="1124569-2",
name="abc",
start_dt="12/02/2018",
addr="343 Beach Dr Newyork NY",
extid="889"
)
]
)
df1.show()
#+--------------------+-----+----+----------+---------+
#| addr|extid|name| start_dt| uid|
#+--------------------+-----+----+----------+---------+
#|343 Beach Dr Newy...| 889| abc|12/02/2018|1124569-2|
#+--------------------+-----+----+----------+---------+
哈希选定的列:
df1.select(
sha2(df1['uid'],256).alias('uid'),
sha2(df1['extid'],256).alias('extid'),
'addr',
'name',
'start_dt'
).show()
#+--------------------+--------------------+--------------------+----+----------+
#| uid| extid| addr|name| start_dt|
#+--------------------+--------------------+--------------------+----+----------+
#|4629619cdf1cbeed6...|a829c72c42755e384...|343 Beach Dr Newy...| abc|12/02/2018|
#+--------------------+--------------------+--------------------+----+----------+
我们不必为此创建udf
。