创建一个Spark udf函数来迭代一个字节数组并将其转换为数字-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

创建一个Spark udf函数来迭代一个字节数组并将其转换为数字

我有一个带有spark(python)字节数组的Dataframe

DF.select(DF.myfield).show(1, False)
+----------------+

myfield
[00 8F 2B 9C 80]

我正在尝试将此数组转换为字符串

'008F2B9C80'
然后到数值

int('008F2B9C80',16)/1000000

2402.0
我找到了一些udf样本,所以我已经可以像这样提取数组的一部分了:

u = f.udf(lambda a: format(a[1],'x'))
DF.select(u(DF['myfield'])).show()
+------------------+

(myfield)
8f

现在如何迭代整个数组?是否可以执行我必须在udf函数中编码的所有操作?

展开
收起
社区小助手 2018-12-05 14:55:07 3813 0
1 条回答
写回答
取消 提交回答
  • 社区小助手
    社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    这是scala df解决方案。您需要导入scala.math.BigInteger

    scala> val df = Seq((Array("00","8F","2B","9C","80"))).toDF("id")
    df: org.apache.spark.sql.DataFrame = [id: array]

    scala> df.withColumn("idstr",concat_ws("",'id)).show
    id idstr
    [00, 8F, 2B, 9C, 80] 008F2B9C80

    scala> import scala.math.BigInt
    import scala.math.BigInt

    scala> def convertBig(x:String):String = BigInt(x.sliding(2,2).map( x=> Integer.parseInt(x,16)).map(_.toByte).toArray).toString
    convertBig: (x: String)String

    scala> val udf_convertBig = udf( convertBig(_:String):String )
    udf_convertBig: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(,StringType,Some(List(StringType)))

    scala> df.withColumn("idstr",concat_ws("",'id)).withColumn("idBig",udf_convertBig('idstr)).show(false)
    id idstr idBig
    [00, 8F, 2B, 9C, 80] 008F2B9C80 2402000000

    scala>
    scala的BigInteger没有等效的spark,所以我将udf()结果转换为字符串。

    2019-07-17 23:18:24
    赞同 展开评论 打赏
问答排行榜
最热
最新
相关电子书
更多
云HBaseSQL及分析 ——Phoenix&Spark
立即下载
R AND SPARK
立即下载
Spark Autotuning
立即下载