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

Posted

技术标签:

【中文标题】将字节数组转换为字符串 spark【英文标题】:Convert byte array to string spark 【发布时间】:2018-07-29 13:08:57 【问题描述】:

我有一个包含多个字段的 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 中有很多字段,其中只有少数字段包含字节数组,我不能直接将该函数应用于每个字段。我不知道哪些是字节数组字段,哪些是字符串、int 字段。

在 csv 文件中将字节数组转换为字符串的任何建议。我正在尝试在 spark 中执行此操作。

我的代码 sn-p :

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我认为这都是垃圾。)!不使用迭代器如何处理数据?如果要进行迭代,为什么要使用解析器?处理自己的问题,而不是别人的问题。 CSV_BUFF.split("\r\n").pop(0) == univocity ?? 我更新了代码。我只想指出一个示例代码。然而实际请求字节数组到字符串。我相信解析不会影响这个。仍然删除了那个解析逻辑。 你搞砸了 writing pattern (如果想使用索引,csv 永远不允许空元素 OR 你想输入空白字段值尝试手动收集数据(永远不要使用模块,模块只抑制少数错误(不是全部))) 【参考方案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,

我看到的直接解决方案是将b'' 字符串替换为空字符串,然后解析数据以形成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])

【讨论】:

更好的方法是lambda x: x[2:-1] 谢谢@ixaxaar :) 更新了答案。

以上是关于将字节数组转换为字符串 spark的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组转换为字符串并返回字节数组的问题

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

如何将字节数组的字符串转换为字节数组

Java将字节数组转换为十六进制字节数组[重复]

将范围为 -128 到 127 的字节数组转换为字符串数组

如何将字节数组转换为字符串[重复]