如何在 pyspark 中读取 s3 上的表格数据?
How to read tabular data on s3 in pyspark?
我在目录 s3://mybucket/my/directory/
.
的 s3 上有一些制表符分隔的数据
现在,我告诉 pyspark 我想使用 \t
作为分隔符来读取 one 文件,如下所示:
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 这是一个制表符分隔文件而不是 parquet 文件?
或者,是否有更简单的方法一次性读取整个目录中的这些文件?
谢谢。
- 编辑:我使用的是 pyspark 版本 1.6.1 *
文件在s3上,所以我不能正常使用:
indata_creds = sqlContext.read.text('s3://mybucket/my/directory/')
因为当我尝试这样做时,我得到 java.io.IOException: No input paths specified in job
还有什么我可以尝试的吗?
由于您使用的是 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')
应该可以!
另一个选项是例如这个。您可以使用制表符拆分它,而不是用逗号拆分它。然后将 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 上使用。
实际问题是我需要将我的 AWS 密钥添加到我的 spark-env.sh
文件中。
我在目录 s3://mybucket/my/directory/
.
现在,我告诉 pyspark 我想使用 \t
作为分隔符来读取 one 文件,如下所示:
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 这是一个制表符分隔文件而不是 parquet 文件?
或者,是否有更简单的方法一次性读取整个目录中的这些文件?
谢谢。
- 编辑:我使用的是 pyspark 版本 1.6.1 *
文件在s3上,所以我不能正常使用:
indata_creds = sqlContext.read.text('s3://mybucket/my/directory/')
因为当我尝试这样做时,我得到 java.io.IOException: No input paths specified in job
还有什么我可以尝试的吗?
由于您使用的是 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')
应该可以!
另一个选项是例如这个
对于您在评论中的替代方案,我不会将其转换为镶木地板文件。除非您的数据非常庞大并且需要压缩,否则不需要它。
对于评论中的第二个问题,是的,可以读取整个目录。 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 上使用。
实际问题是我需要将我的 AWS 密钥添加到我的 spark-env.sh
文件中。