我有一个包含几列数据的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。
发布于 2021-01-21 07:44:25
您需要使用0x
删除substring
(注意字符串索引从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))"
https://stackoverflow.com/questions/65830779
复制