Определите количество типов данных в столбце, который имеет несколько типов данных - PullRequest
1 голос
/ 22 января 2020

Когда я читаю файл Excel, у него появляется такой столбец:

Col1
----
aaa
123
true
235
321
23.23
xxx

Мне нужно определить, сколько типов данных у нас в этом столбце. Когда данные большие, время обработки также велико. Любые варианты в pyspark?

С уважением, A sh

Ответы [ 2 ]

0 голосов
/ 22 января 2020

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|
+---------+-----+
0 голосов
/ 22 января 2020

Сначала вам нужно будет загрузить данные в столбец string, а затем немного поиграть, применив логи c для идентификации типов. Вот пример того, как вы могли бы начать, отличая текст от цифр c столбцов. Я думаю, должно быть легко определить, является ли число плавающим или целым, и т. Д. c.

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|
+---+----------+-------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...