Python读取snappy后缀文件

(作者:陈玓玏)

需要读取个hbase表调用的日志文件,是snappy后缀的。
方法一(未成功,有兴趣的可以再尝试)
snappy是压缩文件,如果要读取其中内容,我们需要先进行解压操作。

#不是这个包
pip3.6 install snappy --user
#是这个包
pip3.6 install python-snappy --user

安装好之后,python3.6进入python,读文件的时候最好加上’rb‘,否则可能报编码问题

import snappy
compressed = open('logs.snappy','rb').read()
uncompress = snappy.uncompress(compressed)

安装时缺乏gcc,通过内网pip源下载安装文件安装也是一样,pip3 download python-snappy,显示

    gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/python2.7 -c snappy/snappymodule.cc -o build/temp.linux-x86_64-2.7/snappy/snappymodule.o
    snappy/snappymodule.cc:31:22: fatal error: snappy-c.h: No such file or directory
     #include 
                          ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: /usr/bin/python2 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-WqNQuM/python-snappy/setup.py'"'"'; __file__='"'"'/tmp/pip-install-WqNQuM/python-snappy/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-JHcPdP/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /home/chendl/.local/include/python2.7/python-snappy Check the logs for full command output.


参考链接:
https://www.alibabacloud.com/help/zh/doc-detail/108942.htm

方法二(成功,但不是最好用的)
于是,找到另一个方法,可以直接把压缩文件加载进hive,然后再用spark或python读取,之后再解析就可以了。

先看看文件结构

hdfs dfs -text /user/log/logs/2020110406/logs.snappy | head -10

然后根据文件结构建一个hive表:

create table tmp.cdl_snappy_test 
(content string)
stored as inputformat 'org.apache.hadoop.mapred.TextInputFormat' 
outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

然后再将文件加载进hive,我的beeline里不能这样操作,总是找不到文件,但spark-sql可以:

load data local inpath 'logs.snappy' into table tmp.cdl_snappy_test;

然后再用spark或hive读取即可。
方法三(成功,最好用的,直接解析成dataframe)
也可以直接用spark读取snappy文件:

df = spark.read.format('json').load('/user/log/logs/2020110406/logs.snappy')

可以直接解析成json,再转化成dataframe,蛮好用

参考链接:
https://blog.csdn.net/weixin_33712987/article/details/91698289

你可能感兴趣的:(Spark,大数据,spark)