在Azure Databricks-Python上使用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

我试图使用Azure DataBricks和python(PySpark)读取Azure EventHub GZIP压缩消息,但使用UDF无法处理二进制类型数据

好的,这是我检查身体的部分

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))