pyspark如何检查给定的spark数据帧是不是已使用inferSchema = True创建

Posted

技术标签:

【中文标题】pyspark如何检查给定的spark数据帧是不是已使用inferSchema = True创建【英文标题】:pyspark how to check if given spark dataframe has created with inferSchema=Truepyspark如何检查给定的spark数据帧是否已使用inferSchema = True创建 【发布时间】:2021-04-28 12:11:38 【问题描述】:

我正在开发一个 API,其中一个函数应该接收一个 spark 数据帧,并使用 spark 数据帧中的架构来执行操作。

由于无法保证用户会创建数据框并将推断架构设置为 True,因此我的函数将收到一个没有推断架构的数据框,因此如果发生这种情况,我想抛出一个错误。

是否可以检查是否已使用 inferSchema=True 创建了数据框? 或者是否有一个 pyspark 函数可以在创建数据框后推断架构?

由于 inferSchema=False 所有列都是 StringType,我不能基于此拒绝数据帧,因为这是某些数据帧的可能架构。

【问题讨论】:

【参考方案1】:

不,它不是这样工作的。 Spark 数据框总是有一个模式,无论模式是来自“推断”还是通过定义。 “怀疑”数据框具有inferSchema=False 的唯一方法是——就像你说的——所有列都是StringType。所以这里的一个选项是你的 API 可以抛出警告而不是错误,如果你看到所有列都是字符串

【讨论】:

谢谢,想知道为什么这不只是作为标志保存在 sparks 数据框对象中。【参考方案2】:

inferSchema 设置为 false 时,Spark 将读取 所有具有 String Data 类型的列。 例如,它还将 ISO 格式的日期列读取为字符串。 但如果将其设置为 true,Spark 就会足够聪明地确定正确的数据类型。

所以尝试通过 dataFrame.printSchema() 检查数据帧并检查上述条件是否成立。

【讨论】:

以上是关于pyspark如何检查给定的spark数据帧是不是已使用inferSchema = True创建的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:如何获取 spark 数据帧的 Spark SQLContext?

如何从 BigQuery 读取分区表到 Spark 数据帧(在 PySpark 中)

PySpark:如何将具有 SparseVector 类型的列的 Spark 数据帧写入 CSV 文件?

如何使用 spark.read.jdbc 读取不同 Pyspark 数据帧中的多个文件

重新分区 pyspark 数据帧失败以及如何避免初始分区大小

如何在 PySpark 中使用 foreach 或 foreachBatch 写入数据库?