【问题标题】:Read Paths and load data in the paths and also capture path details in the dataframe读取路径并在路径中加载数据,并在数据框中捕获路径详细信息
【发布时间】:2021-06-16 15:39:25
【问题描述】:

我正在读取多个路径并使用以下命令在这些路径中加载镶木地板文件:

val paths = List("/mnt/datamount/tmp/fldr=2345","/mnt/datamount/tmp/fldr=1234","/mnt/datamount/tmp/fldr=5678")

下面是读取命令:

val readdf = spark.read.format("parquet").load(paths: _*)

这会读取路径中的所有 parquet 文件,结构如下:

col1: String
col2: Int
col3: Long

有什么方法可以捕获路径信息并将值添加到数据框中?结构如下所示

col1: String
col2: Int
col3: Long
fldr: Int

使用 spark 的分区发现,它可以通过放置基本路径来捕获它,但是有 40000 个分区并且需要时间来读取。使用上述方法,我可以在几秒钟内读取文件,但无法捕获数据帧中的文件夹信息,这些信息需要下游与其他数据帧连接!

【问题讨论】:

  • 您的路径同时包含fldr1fldr3。但是您的架构包含fldr。这是否意味着您不关心路径中的实际列名而只想将它们合并到 1 列中?
  • 我已经编辑了路径..fldr 将是列名

标签: scala apache-spark databricks


【解决方案1】:

您可以单独读取每条路径,以便手动添加额外的列,然后合并所有这些数据框。

import org.apache.spark.sql.functions.lit

def extractFldrFromPath(path: String): String = ???
def readPath(path: String): DataFrame = {
  val fldr = extractFldrFromPath(path)
  val df = spark.read.format("parquet").load(path)
  df.withColumn("fldr", lit(fldr))
}

paths.map(readPath).reduce(_ union _)

【讨论】:

  • 我已经使用 for 循环完成了此操作,但试图查看是否有任何方法可以一次读取所有存在的路径!
  • 你有没有衡量过它有什么不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多