如何将列从十六进制字符串转换为长?

时间:2017-12-21 17:44:29

标签: scala apache-spark apache-spark-sql

我有一个带有Icao列的DataFrame,其中包含十六进制代码,我想将其转换为Long数据类型。我怎么能在Spark SQL中做到这一点?

|  Icao|count|
+------+-----+
|471F8D|81350|
|471F58|79634|
|471F56|79112|
|471F86|78177|
|471F8B|75300|
|47340D|75293|
|471F83|74864|
|471F57|73815|
|471F4A|72290|
|471F5F|72133|
|40612C|69676|

2 个答案:

答案 0 :(得分:5)

TL; DR 使用conv标准功能。

  

conv(num:Column,fromBase:Int,toBase:Int):Column 将字符串列中的数字从一个基数转换为另一个基数。

使用conv解决方案可以如下:

scala> icao.show
+------+-----+
|  Icao|count|
+------+-----+
|471F8D|81350|
|471F58|79634|
|471F56|79112|
|471F86|78177|
|471F8B|75300|
|47340D|75293|
|471F83|74864|
|471F57|73815|
|471F4A|72290|
|471F5F|72133|
|40612C|69676|
+------+-----+

val s1 = icao.withColumn("conv", conv($"Icao", 16, 10))
scala> s1.show
+------+-----+-------+
|  Icao|count|   conv|
+------+-----+-------+
|471F8D|81350|4661133|
|471F58|79634|4661080|
|471F56|79112|4661078|
|471F86|78177|4661126|
|471F8B|75300|4661131|
|47340D|75293|4666381|
|471F83|74864|4661123|
|471F57|73815|4661079|
|471F4A|72290|4661066|
|471F5F|72133|4661087|
|40612C|69676|4219180|
+------+-----+-------+

conv的功能是为您提供输入列类型的结果,因此我开始使用字符串并获得字符串。

scala> s1.printSchema
root
 |-- Icao: string (nullable = true)
 |-- count: string (nullable = true)
 |-- conv: string (nullable = true)

如果我使用了整数,我就有了整数。

您可以使用其他内置方法conv来投射cast的结果(或以适当类型的输入列开头)。

val s2 = icao.withColumn("conv", conv($"Icao", 16, 10) cast "long")
scala> s2.printSchema
root
 |-- Icao: string (nullable = true)
 |-- count: string (nullable = true)
 |-- conv: long (nullable = true)

scala> s2.show
+------+-----+-------+
|  Icao|count|   conv|
+------+-----+-------+
|471F8D|81350|4661133|
|471F58|79634|4661080|
|471F56|79112|4661078|
|471F86|78177|4661126|
|471F8B|75300|4661131|
|47340D|75293|4666381|
|471F83|74864|4661123|
|471F57|73815|4661079|
|471F4A|72290|4661066|
|471F5F|72133|4661087|
|40612C|69676|4219180|
+------+-----+-------+

答案 1 :(得分:1)

您可以使用 java hex to Long converter

java.lang.Long.parseLong(hex.trim(), 16)

您只需要定义udf功能,如下所示

import org.apache.spark.sql.functions.udf
def hexToLong = udf((hex: String) => java.lang.Long.parseLong(hex.trim(), 16))

使用udf api

调用.withColumn函数
df.withColumn("Icao", hexToLong($"Icao")).show(false)