spark中数据在python中的使用

最近遇到了要把spark中的数据拿到python中进行再处理的过程。
常规操作是df.write.format(“csv”).mode(“overwrite”).save("./test.csv")或者是rdd.saveAsTextFile("./test.text")

本来以为常规的保存之后,就能够用了,但是遇到了几个坑,记录一下:

合并文件

在spark中无论是RDD还是dataframe,如果是直接保存的话,会按照分区数量保存成多个文件,如果只想获取一个文件拿到python里面使用,可以用

rdd.coalesce(1).saveAsTextFile("./test.text") 
df.coalesce(1).write.format("csv").mode("overwrite").save("./test.csv")

乱码问题

本来以为保存成一个文件之后,在python就能够顺利使用了,但无论我是保存成textFile还是csv格式,发现python里面会乱码,出现一堆\x005A\xed\x0411A^\t)\x0e\x86\x08\x12\x87\x1e\x0e\x1这样的结果。我一度以为是编码的问题,然后各种使用encoding都不行。而且我的数据里面并没有中文,所以逻辑上不应该存在这样的问题。
这中间修改pd.read_csv的各种参数遇到了各种问题。这里小小罗列一下,也许你们遇到这个问题的时候,也是面临了和我一样的问题。

1、pandas.errors.parsererror: error tokenizing data. c error: buffer overflow caught - possible malformed input file
2、spark save 'utf8' codec can't decode byte 0xa9 in position 7: invalid start byte
3、pandas.errors.ParserError: Error tokenizing data. C error: Expected 3 fields in line 5, saw 5
4、Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.
5、unable to find expected entry 'universe multiverse/source/sources' in release file (wrong sources.list entry or malformed file
......

在濒临放弃的时候,我发现我本地使用小数据集做测试的时候保存文件,文件后缀都直接是“.csv”(保存成csv格式的时候)或者是没有后缀(保存成textfile格式的时候)。但是我在服务器上保存的文件都有.snappy的后缀。后面发现这是因为数量大的时候,spark在保存文件时会对文件进行压缩。所以如果我想实现用spark保存文件之后在python中进行使用,就不能让spark压缩我的文件。这个时候就需要将option选项中的压缩方式改为“不压缩”。

df.write.format("csv").mode("overwrite").option("compression", "uncompressed").save("./test.csv")

参考了一下压缩方式以及其他option选项

saveTextFile的压缩问题

本来想继续用saveTextFile不进行压缩实现将rdd直接保存下来使用的,但是rdd直接保存存在两个问题:
1、没办法“overwrite”
2、网上攻略写在提交spark的时候用 --conf spark.hadoop.mapred.output.compress=false,这个对我来说貌似无效。
综上,我放弃了用saveTextFile,直接使用了rdd.toDF(),然后保存成csv,并在保存的时候添加.option(“header”, “false”),配合在python中使用open()的方式来做了。

python只能读本地文件

用spark保存了的文件,只能储存在服务器上。但是用python进行操作,又不好直接从hdfs上读取文件。而且,我的代码是需要以后设置定时任务进行调度的,所以有没有办法每次手动的把文件从hdfs上download到本地。所以,这里在python中用

os.system("hadoop fs -get hdfs_path local_path")

保证了整个流程不用我自己每次手动干预了。

到此,终于结束了将数据从spark迁移到python中继续进行处理的工作。
问题都不大,但是废了很多时间…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值