Выполнить побитовую операцию для определенных столбцов Dataframe - PullRequest
1 голос
/ 06 марта 2020

У меня есть Dataframe со столбцом, содержащим такие значения, как 3468936084 (Long). Результат, который я хочу получить после выполнения побитовых операций:

((3468936084) >> 16 & 255) = 195

Я попробовал это:

val df2 = df1.withColumn("second", col("aNumber")>> 16 & 255)

Но это не работает.

Как получить ожидаемый результат? результат в scala?

Ответы [ 3 ]

1 голос
/ 06 марта 2020
val df = Seq("3468936084").toDF("A")
val bitOpearationUDF=(value:String) => value.toLong >> 16 & 255
val bitOperation = udf(bitOpearationUDF)
df.withColumn("NewColum", bitOperation(df("A")))

попробуйте код выше.

1 голос
/ 06 марта 2020

Решение состоит в том, чтобы создать udf для выполнения побитовой операции, как показано ниже:

scala> val input = Seq((1, 3468936084L),(2,1468936085L)).toDF("id","num")
input: org.apache.spark.sql.DataFrame = [id: int, num: bigint]

scala> input.show
+---+----------+
| id|       num|
+---+----------+
|  1|3468936084|
|  2|1468936085|
+---+----------+


scala> val myUdf = udf((number: Long) => (number) >> 16 & 255)
myUdf: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,LongType,Some(List(LongType)))

scala> input.printSchema
root
 |-- id: integer (nullable = false)
 |-- num: long (nullable = false)


scala> val df1 = input.withColumn("bitwise", myUdf(col("num")))
df1: org.apache.spark.sql.DataFrame = [id: int, num: bigint ... 1 more field]

scala> df1.show
+---+----------+-------+
| id|       num|bitwise|
+---+----------+-------+
|  1|3468936084|    195|
|  2|1468936085|    142|
+---+----------+-------+

Дайте мне знать, если это поможет !!

0 голосов
/ 06 марта 2020

Вы можете использовать shiftright + & функций в пределах SQL expr:

val df = Seq((3468936084L)).toDF("aNumber")

df.withColumn("second", expr("shiftright(aNumber, 16) & 255")).show

//+----------+------+
//|   aNumber|second|
//+----------+------+
//|3468936084|   195|
//+----------+------+
...