我有一个带有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函数中编码的所有操作?
这是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()结果转换为字符串。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。