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