【问题标题】:Is there a way to get columns names of dataframe in pyspark without reading the whole dataset?有没有办法在不读取整个数据集的情况下获取 pyspark 中数据框的列名?
【发布时间】:2021-04-11 03:17:35
【问题描述】:

我的 HDFS 环境中有大量数据集,例如 500 多个数据集,所有数据集大约有 100M+ 行。我只想获取每个数据集的列名而不读取整个数据集,因为这样做需要很长时间。我的数据是 json 格式的,我正在使用经典的 spark json 阅读器阅读它们:spark.read.json('path')。那么在不浪费我的时间和内存的情况下获取列名的最佳方法是什么?

谢谢...

【问题讨论】:

  • spark.read.json('path').columns 可能会成功,但可能涉及扫描数据以推断架构
  • @mck 是的,它完成了这项工作,但在返回列名之前仍会读取整个数据集!

标签: json apache-spark pyspark hdfs


【解决方案1】:

来自官方文档:

如果没有指定schema参数,这个函数会遍历输入一次来确定输入的schema。

因此,您无法获取仅包含第一行的列名。
不过,您可以先做一个额外的步骤,提取一行并从中创建一个数据框,然后提取列名。

【讨论】:

  • 感谢您的回答@Steven。你能给我一个代码sn-p来做你提到的第一步吗?我是 pyspark 的初学者。
  • @BoubacarTraoré 这不是 pyspark 步骤。您必须使用本地命令(例如hdfs dfs 或 linux 命令)来执行此操作。然后你用 pyspark 阅读。
  • 好的,谢谢@Steven。但是,我在纯pyspark ^-^ 中找到了解决方案
【解决方案2】:

一个答案可能如下:

  1. 使用spark.read.txt('path')方法读取数据
  2. 使用 limit(1) 方法将行数限制为 1,因为我们只希望标题作为列名
  3. 将表格转换为rdd,并使用collect()方法将其收集为列表
  4. 将从unicode string 收集的第一行转换为python dict(因为我正在使用json 格式化数据)。
  5. 上述 dict 的键正是我们要寻找的(python 中的列名称为 list)。

这段代码对我有用:

from ast import literal_eval

literal_eval(spark.read.text('path').limit(1)
                                    .rdd.flatMap(lambda x: x)
                                    .collect()[0]).keys()

它工作得更快的原因可能是pyspark 不会加载带有所有字段结构的整个数据集,如果你使用txt 格式读取它(因为所有内容都被读取为一个大字符串),它更轻更对特定情况有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2013-10-10
    • 2020-04-13
    • 1970-01-01
    相关资源
    最近更新 更多