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

标签 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|

最佳答案

TL;DR 使用 conv标准函数。

conv(num: Column, fromBase: Int, toBase: Int): Column Convert a number in a string column from one base to another.

使用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|
+------+-----+

// conv is not available by default unless you're in spark-shell
import org.apache.spark.sql.functions.conv

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)

如果我使用整数,我就会得到整数。

您可以使用另一种内置方法 cast 转换 conv 的结果(或从输入列的适当类型开始)。

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|
+------+-----+-------+

关于scala - 如何将列从十六进制字符串转换为长字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930150/

相关文章:

apache-spark - Zeppelin notebook 执行不是手动的

java - 如何从 Java 调用具有数字参数的 Scala 方法

scala - 在 scala 中对 tuples2 列表进行分组的更好、更有效的方法

scala - 为什么在案例类的理解和模式匹配中出现编译错误

hadoop - Spark saveAsTextFile 将空文件 - <directory>_$folder$ 写入 S3

java - 在 Apache Spark SQL 中对多行进行操作

scala - 将消息发送到Scala中的函数

apache-spark - sc.parallelize 和 sc.textFile 有什么区别?

python - pyspark - 使用 OR 条件连接

java - 我们如何从数据帧在 scala 中创建嵌套数组?