当前位置: 首页 > 面试题库 >

我可以将多个文件从S3读入Spark Dataframe中,并传递不存在的文件吗?

林丁雷
2023-03-14
问题内容

我想从S3读取多个实木复合地板文件到一个数据帧中。目前,我正在使用以下方法执行此操作:

files = ['s3a://dev/2017/01/03/data.parquet',
         's3a://dev/2017/01/02/data.parquet']
df = session.read.parquet(*files)

如果所有文件都存在于S3上,则此方法有效,但是当列表中的某些文件不存在时,我想请求将文件列表加载到数据帧中而不会中断。换句话说,我希望sparkSql可以将它找到的尽可能多的文件加载到数据帧中,并在不抱怨的情况下返回此结果。这可能吗?


问题答案:

是的,如果您将指定输入的方法更改为hadoop全局模式,则是可能的,例如:

files = 's3a://dev/2017/01/{02,03}/data.parquet'
df = session.read.parquet(files)

您可以在Hadoop
javadoc中
阅读有关模式的更多信息。

但是,我认为这不是按时间(按您的情况按天)分区的数据的一种优雅的处理方式。如果您能够这样重命名目录:

  • s3a://dev/2017/01/03/data.parquet -> s3a://dev/day=2017-01-03/data.parquet
  • s3a://dev/2017/01/02/data.parquet -> s3a://dev/day=2017-01-02/data.parquet

那么您可以利用Spark分区架构并通过以下方式读取数据:

session.read.parquet('s3a://dev/') \
    .where(col('day').between('2017-01-02', '2017-01-03')

这种方式也将省略空目录/不存在的目录。Additionall列day将出现在数据框中(在spark <2.1.0中为字符串,在spark> =
2.1.0中为datetime),因此您将知道每条记录存在于哪个目录中。



 类似资料:
  • 问题内容: 我有多个JAR文件,必须将其添加到Eclipse中的classpath中。 是否可以将30个文件合并为一个文件并包含该文件? 问题答案: 您可能想看看jarjar。 如果您使用Ant任务,也可以进行以下操作:

  • 问题内容: 我对此进行了一些讨论,但还不太了解正确的解决方案:我想将S3中的数百个文件加载到RDD中。这是我现在的做法: 在不使用实际的阅读客户端: 我从在Scala中针对相同问题看到的答案中“翻译”了一下。我认为也可以将整个路径列表传递给,但是我不确定哪种是最佳做法。 问题答案: 根本的问题是,在s3中列出对象的速度确实很慢,并且每当执行树遍历时,看起来像目录树的方式都会降低性能(就像路径的通配

  • 我使用Maven构建了一个Jar。我试图实现的行为是:当用户使用命令create时,我想在JAR的一个文件夹中存储一个XML文件。有可能做到吗? 假设这是一个项目,我将迁移工具的jar添加到其中。我希望能够看到和编辑属性文件

  • 我有从多个文件读取并写入多个文件的Spring批处理配置。是否可以只写入从多个读取的一个文件。假设我收到巨大的XML文件,我将XML拆分为小文件并使用分区器并行读取小文件。但我需要将从不同的小xml文件读取的所有数据写入一个输出文件。Spring批处理是否可以做到这一点?我知道通过使写入器同步是可能的,但我正在寻找任何其他可能的方式作业配置 我得到错误组织。springframework。一批项目

  • 我有一个巨大的文件,里面有大约100万条记录。我的要求是从文件中读取记录,并具有可配置数量的线程,这些线程跨多个线程处理记录。 目前,我正在使用单个线程读取该文件,并将其存储到一个集合中。 如何将集合元素按顺序传递给不同的线程进行进一步处理?

  • 问题内容: 我正在尝试运行一个应用程序(例如),因此它将从文件中读取stdin并从stdout写入另一个文件。 目前我有 它可以按预期工作,因为我可以对该文件进行某些操作,并且top可以接收它。但是我无法重定向top的输出。我该如何实现? 编辑: 好吧,让我们从头开始。我正在测试: 问题答案: 让我们忘掉这似乎是一条红色的鲱鱼。 要将stdin或stdout映射到文件,可以使用重定向: 甚至: