将字节数组转换为字符串spark

4
我有一个CSV文件,其中包含多个字段。有一些字段的数据以字节数组格式(b'1234')出现。我想要删除这些b'(将其从字节数组转换为字符串)。
我了解到可以有两种方法将字节数组转换为字符串。
>>> s1 = b'Hi'
>>> s2 = s1.decode('utf-8') 
>>> print(s2)
Hi


>>> s1 = b'Hi'
>>> s2 = str(s1, 'utf-8')
>>> print(s2)
Hi

由于CSV中有很多字段,其中只有少数字段包含字节数组,因此我无法直接将函数应用于每个字段。我不知道哪些是字节数组字段,哪些是字符串、整数字段。
有什么建议可以将CSV文件中的字节数组转换为字符串。我正在尝试在Spark中完成这个操作。
我的代码片段:
df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true') \
    .option("delimiter", ",")\
    .option("multiLine", "true")\
    .load("file.csv")

输入数据:
b'1234',b'123',Hi,"Hello",b'2FB',b'272',b'4943',b'786',2018-02-19,,Out,768,"Data",b'502',351,

由于模式动态更改,我们无法知道哪些是字节数组,哪些是字符串。我尝试了this的解决方案,但它对我没有起作用(将所有字段转换为NaN)。

糟糕的解析器使用(我认为univocity全是垃圾)!如果不使用迭代器,数据将如何处理?如果要将解析器受到迭代,那你为什么还要使用它呢?解决自己的问题,而不是别人的问题。 - dsgdfg
CSV_BUFF.split("\r\n").pop(0) == univocity - dsgdfg
我更新了代码。我只想指出一个示例代码。然而,实际请求是将字节数组转换为字符串。我相信解析不会影响这个问题。仍然删除了那个解析逻辑。 - data_addict
你的“写作模式”有问题(如果想要使用索引、CSV,绝不允许空元素,或者如果你想要输入空白字段值,尝试手动收集数据(绝不使用模块,因为模块只能抑制一些错误而非全部))。 - dsgdfg
1个回答

1

您说您有一个包含字节的csv文件,如下:

b'1234',b'123',Hi,"Hello",b'2FB',b'272',b'4943',b'786',2018-02-19,,Out,768,"Data",b'502',351,

我看到的解决方案是用空字符串替换''字符串,然后解析数据以形成dataframe
rdd = sc.textFile("path to your csv file")\
    .map(lambda x: x.replace("b'", "").replace("'", ""))

已更新

正如 @ixaxaar 评论中提到的:

更好的方法是使用 lambda x: x[2:-1]

因此,您可以直接执行:

rdd = sc.textFile("path to your csv file").map(lambda x: x[2:-1])

1
更好的方法是使用 lambda x: x[2:-1] - ixaxaar
感谢@ixaxaar :) 已更新答案。 - Ramesh Maharjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接