【问题标题】:Read only parquet file只读镶木地板文件
【发布时间】:2019-09-23 20:20:54
【问题描述】:

我想从一个文件夹中读取多个 parquet 文件,该文件夹还包含一些其他文件类型(csv、avro)到一个数据框中。我只想阅读它的镶木地板并跳过并转到下一个(如果有的话)。 问题是镶木地板文件可能没有扩展名,并且编解码器也可能因文件而异。在 Spark-scala 中有没有办法做到这一点?

【问题讨论】:

  • 到目前为止你做了什么?您是否尝试过 spark.read.parquet(文件路径)?它做了什么?请参阅stackoverflow.com/help/how-to-askstackoverflow.com/help/mcve
  • 即使你使用spark.read.parquet(path),在遇到任何其他文件类型时也会给你一个异常。最好的方法是尝试修改流程以确保每个文件都有扩展名,并遍历文件并使用filter 仅读取镶木地板文件。如果您不能这样做,请执行相同的操作,遍历文件并使用 try-catch 跳过那些给出异常的文件,就像我对这个问题的回答一样:stackoverflow.com/a/51042091/3000244
  • 不确定你到底在找什么,但你可以试试这个spark.read.parquet("/foldername/*/*/*.parquet")这里* and *如果你有两个以上的嵌套文件夹替换为嵌套文件夹然后添加另一个*像这样@987654329 @
  • 在我的情况下无法提供扩展名,即使在处理异常程序在尝试读取镶木地板文件时遇到任何其他类型时失败 java.io.IOException: 无法读取文件的页脚:
  • 所以在这种情况下,您应该迭代所有路径检查那些以 (.endsWith("parquet")) parquet 结尾的文件,并将这些路径添加到一个列表/数组/集合中,然后使用火花读取。例如。如果列表路径具有镶木地板文件的所有路径,则使用此代码val path=List("path1","path2",....,"pathn"); spark.read.parquet(path:_*)

标签: scala apache-spark


【解决方案1】:

您可以通过以下方式预先获取文件名:

improt org.apache.spark.sql.DataFrame
import scala.sys.process._

val fileNames: List[String] = "hdfs dfs -ls /path/to/files/on/hdfs".!!
                             .split("\n")
                             .filter(_.endsWith(".parquet"))
                             .map(_.split("\\s").last).toList

val df: DataFrame = spark.read.parquet(fileNames:_*)

上述代码中的sparkSparkSession 对象。此代码也适用于 Spark 1.x 版本,因为 parquet() 的方法签名在 Spark 1.x 和 Spark 2.x 版本中是相同的。

【讨论】:

  • 嗨Yayati, 1. 需要处理的文件没有扩展名。它们是从其他代码创建的 part_** 文件。 2. 有各种类型的文件作为输入,例如 parquet、avro 。需要在代码中确定类型,并根据每个文件类型执行一些自定义功能。
  • @Prachi 我不认为有办法按照您的建议去做。一种方法是为单独的文件类型创建子目录并读取适当的目录。这将节省时间,您不必编写代码来检查 part_ 文件来识别它们的类型
猜你喜欢
  • 2019-08-04
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2017-05-06
  • 2021-01-12
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多