Pyspark通过更新旧数据框的几列来创建新数据框

时间:2018-12-11 00:43:14

标签: pyspark

我想用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散列。

谢谢。

2 个答案:

答案 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