通过 pyspark 中的 UDF 读取文本文件返回意外输出

Posted

技术标签:

【中文标题】通过 pyspark 中的 UDF 读取文本文件返回意外输出【英文标题】:Read text file via UDF in pyspark returns unexpected output 【发布时间】:2019-06-14 11:25:08 【问题描述】:

我有 pyspark 数据框 df 包含文本文件的路径。我想创建一个包含文本文件内容的新列。

import pyspark.sql.functions as F
from pyspark.sql.types import *

def read_file(filepath): 
    import s3fs
    s3 = s3fs.S3FileSystem()
    with s3.open(filepath) as f:
        return f.read()

read_file_udf = F.udf(read_file, StringType())

df.withColumn('raw_text', read_file_udf('filepath')).show()

+---------------------+-----------+
|  file               |   raw_text|
+---------------------+-----------+
|s3://bucket/file1.txt| [B@aa2a4f3|
|s3://bucket/file2.txt|[B@138664c5|
|s3://bucket/file3.txt| [B@3bcc67e|
|s3://bucket/file4.txt|[B@70b735c4|
|s3://bucket/file5.txt|[B@6fad821d|
+---------------------+-----------+

我没有得到实际的文件内容,而是得到了这些奇怪的[B@ 代码。它们是什么,我为什么要得到它们以及如何解决这个问题?

【问题讨论】:

【参考方案1】:

回答我自己的问题...我得到了[B@,因为read_file() 函数正在返回字符串的字节表示。定义:

def read_file(filepath): 
    import s3fs
    s3 = s3fs.S3FileSystem()
    with s3.open(filepath) as f:
        return f.read().decode("utf-8")

将解决问题。

【讨论】:

以上是关于通过 pyspark 中的 UDF 读取文本文件返回意外输出的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark udf 内存利用率高

在 PySpark 中读取文本文件时有没有办法控制分区数

udf(用户定义函数)如何在 pyspark 中工作?

通过python UDF将文本文件导入pig

Pyspark:UDF 将正则表达式应用于数据帧中的每一行

SparkSession 中的 udf 和 pyspark.sql.functions 中的 udf 有啥区别