数据帧的base64解码
Posted
技术标签:
【中文标题】数据帧的base64解码【英文标题】:base64 decoding of a dataframe 【发布时间】:2019-05-31 20:53:56 【问题描述】:我有一个编码的数据帧,我设法使用 PySpark 中的以下代码对其进行解码。有没有什么简单的方法可以让我通过 Scala/PySpark 在数据帧本身中添加一个额外的列?
import base64
import numpy as np
df = spark.read.parquet("file_path")
encodedColumn = base64.decodestring(df.take(1)[0].column2)
t1 = np.frombuffer(encodedColumn ,dtype='<f4')
我查找了多个类似的问题,但无法让它们起作用。
编辑: 在同事的帮助下成功了。
def binaryToFloatArray(stringValue: String): Array[Float] =
val t:Array[Byte] = Base64.getDecoder().decode(stringValue)
val b = ByteBuffer.wrap(t).order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer()
val copy = new Array[Float](2048)
b.get(copy)
return copy
val binaryToFloatArrayUDF = udf(binaryToFloatArray _)
val finalResultDf = dftest.withColumn("myFloatArray", binaryToFloatArrayUDF(col("_2"))).drop("_2")
【问题讨论】:
【参考方案1】:为此,您有 base64 和 unbase64 函数。
http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=streaming#pyspark.sql.functions.base64
你可以
from pyspark.sql.functions import unbase64,base64
got = spark.createDataFrame([(1, "Jon"), (2, "Danny"), (3, "Tyrion")], ("id", "name"))
+---+------+
| id| name|
+---+------+
| 1| Jon|
| 2| Danny|
| 3|Tyrion|
+---+------+
encoded_got = got.withColumn('encoded_base64_name', base64(got.name))
+---+------+-------------------+
| id| name|encoded_base64_name|
+---+------+-------------------+
| 1| Jon| Sm9u|
| 2| Danny| RGFubnk=|
| 3|Tyrion| VHlyaW9u|
+---+------+-------------------+
decoded_got = encoded_got.withColumn('decoded_base64', unbase64(encoded_got.encoded_base64).cast("string"))
# Need to use cast("string") to convert from binary to string
+---+------+--------------+--------------+
| id| name|encoded_base64|decoded_base64|
+---+------+--------------+--------------+
| 1| Jon| Sm9u| Jon|
| 2| Danny| RGFubnk=| Danny|
| 3|Tyrion| VHlyaW9u| Tyrion|
+---+------+--------------+--------------+
【讨论】:
感谢 Achilleus,我之前尝试过,但我认为编码有一些不同,因为数据被转换为“二进制”列。我试图将其转换为字符串,但结果数据不是我们想要的。有问题的列是十进制值数组 啊,明白了。虽然它适用于字符串。你能发布一个你试图编码的数据的例子吗?以上是关于数据帧的base64解码的主要内容,如果未能解决你的问题,请参考以下文章