我在目录s3://mybucket/my/directory/
中的s3上有一些制表符分隔数据。
现在,我告诉pyspark我想使用\t
作为分隔符来读取一个文件,如下所示:
from pyspark import SparkContext
from pyspark.sql import HiveContext, SQLContext, Row
from pyspark.sql.types import *
from datetime import datetime
from pyspark.sql.functions import col, date_sub, log, mean, to_date, udf, unix_timestamp
from pyspark.sql.window import Window
from pyspark.sql import DataFrame
sc =SparkContext()
sc.setLogLevel("DEBUG")
sqlContext = SQLContext(sc)
indata_creds = sqlContext.read.load('s3://mybucket/my/directory/onefile.txt').option("delimiter", "\t")
但它告诉我:assertion failed: No predefined schema found, and no Parquet data files or summary files found under s3://mybucket/my/directory/onefile.txt
如何告诉pyspark这是制表符分隔文件而不是拼花文件?
或者,是否有更简单的方法可以一次性读取整个目录中的这些文件?
感谢。
文件在s3上,所以我无法使用通常的:
indata_creds = sqlContext.read.text('s3://mybucket/my/directory/')
因为当我尝试时,我得到java.io.IOException: No input paths specified in job
我还能尝试其他什么吗?
答案 0 :(得分:1)
由于您正在使用Apache Spark 1.6.1,因此您需要spark-csv才能使用此代码:
indata_creds = sqlContext.read.format('com.databricks.spark.csv').option('delimiter', '\t').load('s3://mybucket/my/directory/onefile.txt')
这应该有用!
另一种选择是例如answer。您可以使用逗号分隔它,而不是用逗号分割它。然后将RDD加载到数据帧中。但是,第一个选项更容易,并已将其加载到数据框中。
如果您的评论中有替代方案,我不会将其转换为镶木地板文件。除非您的数据非常庞大并且需要压缩,否则不需要它。
对于评论中的第二个问题,是的,可以阅读整个目录。 Spark支持regex / glob。所以你可以这样做:
indata_creds = sqlContext.read.format('com.databricks.spark.csv').option('delimiter', '\t').load('s3://mybucket/my/directory/*.txt')
顺便问一下,你为什么不使用2.x.x?它也可以在aws上使用。
答案 1 :(得分:0)
实际问题是我需要将我的AWS密钥添加到我的spark-env.sh
文件中。