Pyspark 标识具有多个数据类型的列中的数据类型计数

Pyspark 标识具有多个数据类型的列中的数据类型计数,pyspark,Pyspark,当我读excel文件时,它有一个这样的列 Col1 ---- aaa 123 true 235 321 23.23 xxx 我需要确定本专栏中有多少数据类型。当数据很大时,处理时间也很大。pyspark有什么选择吗 问候,, Ash您必须首先将数据加载到字符串列中,然后通过应用一些逻辑来识别类型,您可以播放一些。下面是一个示例,您可以从区分文本和数字列开始。我想应该很容易判断一个数字是浮点还是整数,等等 df = spark.createDataFrame([ (1, "a"),

当我读excel文件时,它有一个这样的列

Col1
----
aaa
123
true
235
321
23.23
xxx
我需要确定本专栏中有多少数据类型。当数据很大时,处理时间也很大。pyspark有什么选择吗

问候,,
Ash

您必须首先将数据加载到
字符串
列中,然后通过应用一些逻辑来识别类型,您可以播放一些。下面是一个示例,您可以从区分文本和数字列开始。我想应该很容易判断一个数字是浮点还是整数,等等

df = spark.createDataFrame([
    (1, "a"), 
    (2, "123"),
    (3, "22.12"),
    (4, "c"),
    (5, "True")
], ("ID","mixed_data"))

from pyspark.sql import functions as F

casted = df.select("ID", "mixed_data",F.when(F.col("mixed_data").cast('float').isNull(), "text").otherwise("some kind of number").alias("guessed_type"))

+---+----------+-------------------+
| ID|mixed_data|       guessed_type|
+---+----------+-------------------+
|  1|         a|               text|
|  2|       123|some kind of number|
|  3|     22.12|some kind of number|
|  4|         c|               text|
|  5|      True|               text|
+---+----------+-------------------+

您必须首先将数据加载到
字符串
列,然后通过应用一些逻辑来识别类型来播放一段时间。下面是一个示例,您可以从区分文本和数字列开始。我想应该很容易判断一个数字是浮点还是整数,等等

df = spark.createDataFrame([
    (1, "a"), 
    (2, "123"),
    (3, "22.12"),
    (4, "c"),
    (5, "True")
], ("ID","mixed_data"))

from pyspark.sql import functions as F

casted = df.select("ID", "mixed_data",F.when(F.col("mixed_data").cast('float').isNull(), "text").otherwise("some kind of number").alias("guessed_type"))

+---+----------+-------------------+
| ID|mixed_data|       guessed_type|
+---+----------+-------------------+
|  1|         a|               text|
|  2|       123|some kind of number|
|  3|     22.12|some kind of number|
|  4|         c|               text|
|  5|      True|               text|
+---+----------+-------------------+

spark
没有内置的用于返回值数据类型的udf,因此实现
udf
要返回数据类型,您可以使用
regexp
选项扩展此处为其他数据类型定义的函数

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql import types as T

def get_data_type(val):
    data_type = None
    try:
        float(val)
        data_type = "float"
    except ValueError:
        if (data_type != None and val.isnumeric()):
            data_type = 'int'
        else:
            if (val.lower() in ("yes", "no", "true", "false")):
                data_type = 'boolean'
            else:
                data_type = "string"
    else:
        if float(val).is_integer():
            data_type = "int"
    return data_type

get_data_type_udf = F.udf(get_data_type, T.StringType())

df = spark.createDataFrame(['aaa','123','true','235','321','23.23'], T.StringType()).toDF("col1")
df = df.select(get_data_type_udf(F.col("col1")).alias("data_type")).groupBy("data_type").count()
df.show()
结果是什么

+---------+-----+
|data_type|count|
+---------+-----+
|      int|    3|
|  boolean|    1|
|   string|    1|
|    float|    1|
+---------+-----+

spark
没有内置的用于返回值数据类型的udf,因此实现
udf
要返回数据类型,您可以使用
regexp
选项扩展此处为其他数据类型定义的函数

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql import types as T

def get_data_type(val):
    data_type = None
    try:
        float(val)
        data_type = "float"
    except ValueError:
        if (data_type != None and val.isnumeric()):
            data_type = 'int'
        else:
            if (val.lower() in ("yes", "no", "true", "false")):
                data_type = 'boolean'
            else:
                data_type = "string"
    else:
        if float(val).is_integer():
            data_type = "int"
    return data_type

get_data_type_udf = F.udf(get_data_type, T.StringType())

df = spark.createDataFrame(['aaa','123','true','235','321','23.23'], T.StringType()).toDF("col1")
df = df.select(get_data_type_udf(F.col("col1")).alias("data_type")).groupBy("data_type").count()
df.show()
结果是什么

+---------+-----+
|data_type|count|
+---------+-----+
|      int|    3|
|  boolean|    1|
|   string|    1|
|    float|    1|
+---------+-----+

我这样做只是做了一点小小的改变,但是当数据集很大时,这就变得很困难了。无论如何,谢谢。我正在做这件事,只是做了一点小小的改变,但是当数据集很大时,就变得很困难了。无论如何,谢谢你。