使用pyspark获取列的数据类型

Sre*_*ulu 24 apache-spark apache-spark-sql pyspark databricks

我们正在从MongoDB读取数据Collection.Collection列有两个不同的值(例如:) (bson.Int64,int) (int,float).

我试图使用pyspark获取数据类型.

我的问题是有些列有不同的数据类型.

假设quantity并且weight是列

quantity           weight
---------          --------
12300              656
123566000000       789.6767
1238               56.22
345                23
345566677777789    21
Run Code Online (Sandbox Code Playgroud)

实际上我们没有为mongo集合的任何列定义数据类型.

当我从中查询计数时 pyspark dataframe

dataframe.count()
Run Code Online (Sandbox Code Playgroud)

我这样的例外

"Cannot cast STRING into a DoubleType (value: BsonString{value='200.0'})"
Run Code Online (Sandbox Code Playgroud)

eli*_*sah 51

你的问题很广泛,因此我的答案也很广泛.

要获取DataFrame列的数据类型,可以使用dtypesie:

>>> df.dtypes
[('age', 'int'), ('name', 'string')]
Run Code Online (Sandbox Code Playgroud)

这意味着您的列age属于类型intname属于类型string.

  • 除非您提供@desertnaut 要求的信息,否则我不会调查您的问题。你有一个我已经回答过的问题,现在这个问题演变成完全不同的问题,你没有努力正确地写出这个问题。请根据评论中讨论的准则查看您的问题。 (2认同)

rop*_*der 27

对于来到这里寻找帖子标题中确切问题的答案的其他人(即单列的数据类型,而不是多列),我一直无法找到一种简单的方法来做到这一点。

幸运的是,使用dtypes以下方法获取类型很简单:

def get_dtype(df,colname):
    return [dtype for name, dtype in df.dtypes if name == colname][0]

get_dtype(my_df,'column_name')
Run Code Online (Sandbox Code Playgroud)

(请注意,如果有多个同名列,这只会返回第一列的类型)

  • 更简洁:`dict(df.dtypes)[colname]` (17认同)

gen*_*nch 11

import pandas as pd
pd.set_option('max_colwidth', -1) # to prevent truncating of columns in jupyter

def count_column_types(spark_df):
    """Count number of columns per type"""
    return pd.DataFrame(spark_df.dtypes).groupby(1, as_index=False)[0].agg({'count':'count', 'names': lambda x: " | ".join(set(x))}).rename(columns={1:"type"})
Run Code Online (Sandbox Code Playgroud)

jupyter notebook 中 4 列 spark 数据帧的示例输出:

count_column_types(my_spark_df)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Lui*_*.G. 7

我不知道你是如何从 mongodb 读取的,但是如果你使用的是 mongodb 连接器,数据类型将自动转换为 spark 类型。要获取 spark sql 类型,只需像这样使用架构属性:

df.schema
Run Code Online (Sandbox Code Playgroud)