Pyspark:如何将.gz日志文件加载到pyspark.sql.dataframe.DataFrame中

时间:2017-01-30 15:18:02

标签: python apache-spark pyspark apache-spark-sql spark-dataframe

所以我有一个在线托管的.gz日志文件,比如这个

https://example.com/sample.log.gz

我可以使用以下命令将其加载到Python列表中:

import urllib2
from StringIO import StringIO
import gzip

request = urllib2.Request('https://example.com/sample.log.gz')
response = urllib2.urlopen(request)
buf = StringIO(response.read())
f = gzip.GzipFile(fileobj=buf)
data = f.readlines() # Python list

然后我尝试使用

将此列表转换为DataFrame

sqlContext.createDataFrame(data)

但得到了

TypeError: Can not infer schema for type: <type 'str'>

将.gz日志文件直接加载到pyspark.sql.dataframe.DataFrame的有效方法是什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

问题来自您的data变量的形式。 它是['qwr', 'asd', 'wer']但必须是[['qwr'], ['asd'], ['wer']]

为此,您可以使用data = [[x] for x in data]

然后sqlContext.createDataFrame(data)

另一个解决方案可能是将文件直接加载为textFile(但是它需要以某种方式保存文件)然后按上面的方式进行转换:

f = tempfile.NamedTemporaryFile(delete=True)
shutils.copyfileobj(response, f)
rdd = sc.textFile(f.name)
//save transformation as previously
rdd_list = rdd.map(lambda x: [x])
df = sqlContext.createDataFrame(rdd_list)