检查 DF 中是不是存在列 - Java Spark

Posted

技术标签:

【中文标题】检查 DF 中是不是存在列 - Java Spark【英文标题】:Check if a column exists in DF - Java Spark检查 DF 中是否存在列 - Java Spark 【发布时间】:2020-07-14 20:38:32 【问题描述】:

我正在尝试检查是否有任何方法可以查看 Dataframe 中是否存在特定列,并使用 Java Spark 进行检查。 我搜索并最终得到了与 Python 相关的建议,但没有与 Java 相关的建议。

我正在从 Mongo 中提取这些数据并尝试检查某些列是否存在。 mongo db 中没有可用于此表的架构验证。

以下是我的架构,我想检查它们是否存在于我的列配置中。

 |-- _id: string (nullable = true)
 |-- value: struct (nullable = true)
 |    |-- acctId: string (nullable = true)
 |    |-- conId: string (nullable = true)
 |    |-- dimensions: struct (nullable = true)
 |    |    |-- device: struct (nullable = true)
 |    |    |    |-- accountId: long (nullable = true)
 |    |    |    |-- addFreeTitleTime: timestamp (nullable = true)
 |    |    |    |-- build: string (nullable = true)
 |    |    |    |-- country: string (nullable = true)
 |    |    |    |-- countryOfResidence: string (nullable = true)
 |    |    |    |-- createDate: timestamp (nullable = true)
 |    |    |    |-- number: string (nullable = true)
 |    |    |    |-- FamilyName: string (nullable = true)
 |    |    |    |-- did: long (nullable = true)
 |    |    |    |-- deviceToken: string (nullable = true)
 |    |    |    |-- initialBuildNumber: string (nullable = true)
 |    |    |    |-- language: string (nullable = true)
 |    |    |    |-- major: integer (nullable = true)
 |    |    |    |-- minor: integer (nullable = true)
 |    |    |    |-- model: string (nullable = true)
 |    |    |    |-- modelDesc: string (nullable = true)
 |    |    |    |-- modelId: string (nullable = true)
 |    |    |    |-- modifyDate: timestamp (nullable = true)
 |    |    |    |-- preReg: integer (nullable = true)
 |    |    |    |-- retailer: string (nullable = true)
 |    |    |    |-- serialNumber: string (nullable = true)
 |    |    |    |-- softwareUpdateDate: timestamp (nullable = true)
 |    |    |    |-- softwareVersion: string (nullable = true)
 |    |    |    |-- sourceId: string (nullable = true)
 |    |    |    |-- timeZone: string (nullable = true)
 |    |    |-- location: struct (nullable = true)

您的意见和建议将很有价值。

提前致谢

【问题讨论】:

columns() 函数呢? @Dennis Kozevnikoff --- 我试过 columns() ,但之后 find () 方法不可用 【参考方案1】:

是的,您可以在 Java 中通过获取数据集的所有列并检查您想要的列是否存在来实现此目的。在这里给出示例:

Dataset<Object1> dataSet = spark.read().text("dataPath").as(Encoders.bean(Object1.class)); //load data in dataset
String[] columns = dataSet.columns(); // fetch all column names
System.out.println(Arrays.toString(columns).contains("columnNameToCheckFor")); //check if the column name we want to check exist in the array of columns.

这里我使用了一种非常幼稚的方法来检查列名是否存在于列数组中,您可以使用任何其他方法来执行此检查。

【讨论】:

嗨@Neha Kumari,感谢分享,让我尝试实现相同的。我还想知道我们是否可以检查,如果没有,如果不存在,则在该列中添加一个空值? 是的,你可以做到。检查“withColumn”选项。如果您希望我为此提供示例代码,请告诉我。 当我尝试打印列数组时,它只打印 ID、值。 MongoDB JSON 是 JSON 数组中 152 列的结构,它们在内部就像 ID , value a,b,c,a1,b1,c2:c21,c22 我需要要检查的内部列名 a1、a2。如果您可以分享为不存在的列添加 null 的示例代码,这将很有帮助并给我一个想法。 可以作为不同的问题涵盖吗?让我们为一个理智的社区维护 SoC。此外,如果当前答案解决了当前问题中提到的问题,应该接受它,以提高未来将面临相同问题的其他人的可见度。 嗨@Neha Kumari - 我希望从 MongoDB 中获取嵌套 Json 中的列名。我错过了在问题中提及这一点。让我更新一下。很抱歉造成混乱。【参考方案2】:
sourceDF.printSchema
//  root
//  |-- category: string (nullable = true)
//  |-- tags: string (nullable = true)
//  |-- datetime: string (nullable = true)
//  |-- date: string (nullable = true)

  val cols = sourceDF.columns
//  cols: Array[String] = Array(category, tags, datetime, date)

  val IsFieldCategory = cols.filter(_ == "category")
//  IsFieldCategory: Array[String] = Array(category)

val isFieldTags = sourceDF.columns.contains("tags")
//  isFieldTags: Boolean = true

【讨论】:

嗨 @mvasyliv - 感谢您分享相同的内容,但我正在寻找 Java 的解决方案。谢谢

以上是关于检查 DF 中是不是存在列 - Java Spark的主要内容,如果未能解决你的问题,请参考以下文章

检查列 pyspark df 的值是不是存在于其他列 pyspark df

检查给定列表中的元素是不是存在于 DataFrame 的数组列中

Pyspark:检查数据框中是不是存在列[重复]

如何检查pandas MultiIndex中是不是存在列

检查是不是存在多个列

flyway检查Java中是不是存在列