Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 通过Spark读取文件夹中保存的所有拼花文件_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 通过Spark读取文件夹中保存的所有拼花文件

Scala 通过Spark读取文件夹中保存的所有拼花文件,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个包含拼花文件的文件夹。大概是这样的: 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.ap

我有一个包含拼花文件的文件夹。大概是这样的:

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
文件夹中的所有拼花文件时,它会给我错误信息

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

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

Spark不像您想象的那样写/读拼花地板

它使用Hadoop库来写/读分区拼花地板文件

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

val df = spark.read.parquet("/tmp/test/df/1.parquet/")
我建议你阅读官方文件以了解更多细节。[比照]

编辑:

你一定在找这样的东西:

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中使用通配符

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

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

您在
/tmp/test/df/1.parquet
/tmp/test/df/2.parquet
上编写的文件不是输出文件,而是输出目录。 所以,你可以阅读拼花地板是什么

val data = spark.read.parquet("/tmp/test/df/1.parquet/")

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

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/")
此外,我们可以从数据文件夹中的所有文件中读取数据:

val df = spark.read.format("parquet").load("/tmp/data1/")

好吧,你的问题不清楚。我已经更新了我的答案。谢谢@eliasah
val df=sqlContext.read.load(“/tmp/test/df/*”)
对我很有效。我正在为Spark版本2.1.1中的prequet文件编写Java代码代码代码:
Dataset df=Spark.read().json(“adl://xxxxxxxxx.azuredatalakestore.net/test/data.json"); df.write().mode(“overwrite”).parquet(“data.parquet”);数据集newDataDF=spark.read().parquet(“data.parquet/”)它显示了相同的错误
“org.apache.spark.sql.AnalysisException:无法推断拼花地板的架构。必须手动指定它。”
您可以帮助我吗?@umarfaraz您应该像其他人一样发布一个问题。如果我有时间看的话,我会的。我现在很忙。我也有同样的错误,所以我想把它贴在这里,当然要慢慢来@eliasah