在PySpark中使用Python将列转换为/从十六进制



我有一个包含几列数据的DataFrame(使用. todf从PySpark RDD转换)。其中一列包含十六进制格式的值,例如:

+----------+
|        id|
+----------+
|0x0087AFEE|
|0x00840190|
|0x0082F4D3|
|0x00871A60|
|0x00850A0E|
|0x0084557C|
...

在另一个DataFrame中,我有相同的ID,但在十进制值中,我想与此列连接。我假设我需要先将这些值转换为以10为基数的小数(反之亦然)以便进行比较。我怎样才能做到这一点呢?

我试着:

df.withColumn('dec_id', sf.conv(df['id'], 16, 10))

但是返回的是0

您需要使用substring删除0x(注意字符串索引从1开始):

import pyspark.sql.functions as F
df.withColumn('dec_id', F.expr("conv(substring(id, 3), 16, 10)")).show()
+----------+-------+
|        id| dec_id|
+----------+-------+
|0x0087AFEE|8892398|
|0x00840190|8651152|
|0x0082F4D3|8582355|
|0x00871A60|8854112|
|0x00850A0E|8718862|
|0x0084557C|8672636|
+----------+-------+

注意结果是字符串类型。如果你想要int/long类型,你可以相应地强制转换,例如

"int(conv(substring(id, 3), 16, 10))"