Ниже приведено одно работающее решение:
пример dataframe =>
import org.apache.spark.sql.Row
import org.apache.spark.sql.types._
val data =
Seq(
Row(1275, 200272593),
Row(145, 0),
Row(2678, 200274543),
Row(6578, 200272593),
Row(1001, 200272593))
val dF = spark.createDataFrame(spark.sparkContext.parallelize(data),
StructType(List(StructField("num", IntegerType, nullable = true),
StructField("clientIPInt", IntegerType, nullable = true))))
+----+-----------+
| num|clientIPInt|
+----+-----------+
|1275| 200272593|
| 145| 0|
|2678| 200274543|
|6578| 200272593|
|1001| 200272593|
+----+-----------+
с использованием функций с поддержкой искры =>
import spark.implicits._
import org.apache.spark.sql.functions._
dF.withColumn("i", when('clientIPInt <= 0, ('clientIPInt cast "long") + 4294967296L).otherwise('clientIPInt cast "long"))
.withColumn("ip64bigint", (('i.bitwiseAND(255L) * 16777216L) + ('i.bitwiseAND(65280L) * 256L) + ('i.bitwiseAND(16711680L) / 256L) + ('i / 16777216L).cast("long").bitwiseAND(255L)) cast "long")
.drop("i").show(false)
Output =>
+----+-----------+----------+
|num |clientIPInt|ip64bigint|
+----+-----------+----------+
|1275|200272593 |3521834763|
|145 |0 |0 |
|2678|200274543 |1878191883|
|6578|200272593 |3521834763|
|1001|200272593 |3521834763|
+----+-----------+----------+