在Azure Databricks-Python上使用UDF解压缩流数据失败
我试图使用Azure DataBricks和python(PySpark)读取Azure EventHub GZIP压缩消息,但使用UDF无法处理二进制类型数据 好的,这是我检查身体的部分在Azure Databricks-Python上使用UDF解压缩流数据失败,python,pyspark,binary,azure-eventhub,azure-databricks,Python,Pyspark,Binary,Azure Eventhub,Azure Databricks,我试图使用Azure DataBricks和python(PySpark)读取Azure EventHub GZIP压缩消息,但使用UDF无法处理二进制类型数据 好的,这是我检查身体的部分 df = eventHubStream.withColumn("body", eventHubStream["body"]).select("body") display(df, truncate=False) 这将显示一个经过良好压缩的数据,如下所示:H4sIAKeM0FwC/3vs22rbqbb9z1c
df = eventHubStream.withColumn("body", eventHubStream["body"]).select("body")
display(df, truncate=False)
这将显示一个经过良好压缩的数据,如下所示:H4sIAKeM0FwC/3vs22rbqbb9z1ciq6elwn37jw8bamekzemrnk4lhcxuppg2cyncy…
但是,当我尝试将数据发送到我的UDF时,它的行为与预期不符。函数实际上什么都不做,但输出看起来好像已经被转换了:
import zlib
from pyspark.sql.types import StringType
def streamDecompress(val: BinaryType()):
#return zlib.decompress(val)
return val
func_udf = udf(lambda x: streamDecompress(x), StringType())
df = eventHubStream.withColumn("body", func_udf(eventHubStream["body"])).select("body")
display(df, truncate=False)
以下是输出:
[B@49d3f786
所以,正如预期的那样,当我尝试使用zlib解压时,它失败了
有人知道我是怎么做的吗?嗯,这比我想象的要简单得多。我基本上是,试图显示一个字节一样的数据哈哈 下面的代码解决了这个问题:
import zlib
def streamDecompress(val):
return str(zlib.decompress(val, 15+32))
func_udf = udf(lambda x: streamDecompress(x))
df = eventHubStream.withColumn("body", func_udf(eventHubStream["body"])).select('body')
display(df, truncate=False)
(我想)你可以简化,但有一个问题。。15+32是做什么的?!看起来很神奇,但我看到它在某种程度上与其他谷歌搜索的标题和校验和有关。。。请注意,还是很奇怪!正如这里的文档所述:在解压缩部分:“+40到+47=32+(8到15):使用值的低4位作为窗口大小对数,并自动接受zlib或gzip格式。”这已经非常简单。我不确定我们是否能真正简化这一点。但您可以做的一件事是删除显式UDF声明并使其隐式:@UDF def streamDecompress(value):返回str(zlib.decompress(value,15+32))