首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Spark读取保存在文件夹中的所有拼图文件

通过Spark读取保存在文件夹中的所有拼图文件
EN

Stack Overflow用户
提问于 2017-03-27 14:26:09
回答 3查看 38.2K关注 0票数 13

我有一个包含拼图文件的文件夹。如下所示:

代码语言:javascript
复制
scala> val df = sc.parallelize(List(1,2,3,4)).toDF()
df: org.apache.spark.sql.DataFrame = [value: int]

scala> df.write.parquet("/tmp/test/df/1.parquet")

scala> val df = sc.parallelize(List(5,6,7,8)).toDF()
df: org.apache.spark.sql.DataFrame = [value: int]

scala> df.write.parquet("/tmp/test/df/2.parquet")

当我去读取df文件夹中的所有拼图文件时,在保存数据帧后,它给出了错误。

代码语言:javascript
复制
scala> val read = spark.read.parquet("/tmp/test/df")
org.apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually.;
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$8.apply(DataSource.scala:189)
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$8.apply(DataSource.scala:189)
  at scala.Option.getOrElse(Option.scala:121)
  at org.apache.spark.sql.execution.datasources.DataSource.org$apache$spark$sql$execution$datasources$DataSource$$getOrInferFileFormatSchema(DataSource.scala:188)
  at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:387)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152)
  at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:441)
  at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:425)
  ... 48 elided

我知道我可以通过给出完整路径来读取拼图文件,但如果有一种方法可以读取文件夹中的所有拼图文件,那就更好了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-27 15:25:02

Spark不会像你想的那样写/读拼花。

它使用Hadoop库来读/写分区的拼图文件。

因此,您的第一个拼图文件位于路径/tmp/test/df/1.parquet/下,其中1.parquet是一个目录。这意味着当从parquet中读取时,您需要提供parquet目录的路径,或者如果是一个文件,则提供路径。

代码语言:javascript
复制
val df = spark.read.parquet("/tmp/test/df/1.parquet/")

我建议您阅读官方文档以了解更多详细信息。[参见SQL Programming Guide - Parquet Files]

编辑:

你一定是在找这样的东西:

代码语言:javascript
复制
scala> sqlContext.range(1,100).write.save("/tmp/test/df/1.parquet")

scala> sqlContext.range(100,500).write.save("/tmp/test/df/2.parquet")

scala> val df = sqlContext.read.load("/tmp/test/df/*")
// df: org.apache.spark.sql.DataFrame = [id: bigint]

scala> df.show(3)
// +---+
// | id|
// +---+
// |400|
// |401|
// |402|
// +---+
// only showing top 3 rows

scala> df.count
// res3: Long = 499

您还可以在文件路径URI中使用通配符。

您可以提供多个文件路径,如下所示:

代码语言:javascript
复制
scala> val df2 = sqlContext.read.load("/tmp/test/df/1.parquet","/tmp/test/df/2.parquet")
// df2: org.apache.spark.sql.DataFrame = [id: bigint]

scala> df2.count
// res5: Long = 499
票数 20
EN

Stack Overflow用户

发布于 2017-03-27 17:15:59

您在/tmp/test/df/1.parquet/tmp/test/df/2.parquet上编写的文件不是输出文件,它们是输出目录。所以,你可以读到镶木地板是

代码语言:javascript
复制
val data = spark.read.parquet("/tmp/test/df/1.parquet/")
票数 1
EN

Stack Overflow用户

发布于 2020-02-14 17:12:57

你可以将数据写入文件夹而不是单独的Spark“文件”(实际上是文件夹) 1.parquet2.parquet等。如果不设置文件名而只设置路径,Spark会将文件作为真实文件(而不是文件夹)放入文件夹中,并自动命名这些文件。

代码语言:javascript
复制
df1.write.partitionBy("countryCode").format("parquet").mode("overwrite").save("/tmp/data1/")
df2.write.partitionBy("countryCode").format("parquet").mode("append").save("/tmp/data1/")
df3.write.partitionBy("countryCode").format("parquet").mode("append").save("/tmp/data1/")

此外,我们还可以从data文件夹中的所有文件中读取数据:

代码语言:javascript
复制
val df = spark.read.format("parquet").load("/tmp/data1/")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43039254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档