所以我有一个在线托管的.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
的有效方法是什么?
感谢您的帮助!
答案 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)