获取 Apache spark 数据集中包含的列的列数据类型

Posted

技术标签:

【中文标题】获取 Apache spark 数据集中包含的列的列数据类型【英文标题】:Get column data type of a column contained in a Apache spark data set 【发布时间】:2018-02-07 14:50:20 【问题描述】:

我正在尝试查找是否有一种方法可以使用 java 获取包含在 Apache spark 数据集中的列的数据类型? 我有一个数据集,其中包含一个名为 SSN 的列,我编写了这段代码来修剪该列中的数据:

Dataset<Row> trimmedOutput = trimInput.select(trim(trimInput.col("SSN")).as("SSN")

我正在尝试获取 SSN 列的数据类型,以根据预期类型对其进行验证。

有人可以帮帮我吗?

【问题讨论】:

除非您向我们提供 minimal reproducible example 以供使用,否则不会。 :) 在 scala 中你可以做trimmedOutput.schema.fields(0).dataType.typeName,也许这也适用于 java @philantrovert 这个问题是在您发表评论后编辑的吗?因为我看到这个问题有足够的信息来回答。 【参考方案1】:

我来这里是为了寻找相同的答案 :) 现在查看 API,这是我能想到的一种方法:

public static String dataTypeString(Dataset<Row> dataset, String colName) 
        StructField[] fields = dataset.schema().fields();
        String dataType = null;
        for(StructField field: fields) 
            if(field.name().equals(colName)) 
                dataType =  field.dataType().typeName();
                break;
            
        
        return dataType;
    

要了解 trimmedOutput 数据集中 SSN 列的数据类型,请按如下方式使用:

dataTypeString(trimmedOutput, "SSN") 

还有一个类似的方法 simpleString() 可以调用来代替 typeName(),API 文档提到了这两者之间的区别。

如果您的意图是检查数据集中的列是否属于某种数据类型,如果不是,则失败,以下代码将有所帮助:

SchemaUtils.checkColumnType(holdoutResults.schema(), 
                            "SSN", 
                            DataTypes.StrringType, 
                           "Datatype Mismatch for column SSN");

上述调用将检查“SSN”列是否为字符串类型,如果不是,它将失败并显示您作为最后一个参数传递的消息 - “列 SSN 的数据类型不匹配”。此方法仅适用于 ml 库中的 SchemUtils 类。

【讨论】:

以上是关于获取 Apache spark 数据集中包含的列的列数据类型的主要内容,如果未能解决你的问题,请参考以下文章

将值转换为 Spark 数据集中的列(将列的键和值对转换为常规列)[重复]

如何获取数据集中具有空值的列的总数? [复制]

使用 spark java 获取列的每个值的特定百分比数据

使用 Spark 过滤大型数据集中的列

无法使用 spark scala 从数据集中的行中获取第一列的值

具有大量列的数据帧上的 Spark 窗口函数