使用pyspark获取列的数据类型

时间:2017-07-11 11:29:42

标签: apache-spark pyspark apache-spark-sql databricks

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

我正在尝试使用pyspark获取数据类型。

我的问题是某些列具有不同的数据类型。

假设quantityweight是列

quantity           weight
---------          --------
12300              656
123566000000       789.6767
1238               56.22
345                23
345566677777789    21

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

当我从pyspark dataframe

查询计数时
dataframe.count()

我有这样的例外

"Cannot cast STRING into a DoubleType (value: BsonString{value='200.0'})"

6 个答案:

答案 0 :(得分:33)

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

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

>>> df.dtypes
[('age', 'int'), ('name', 'string')]

这意味着您的列age的类型为int,而name的类型为string

答案 1 :(得分:4)

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

df.schema

答案 2 :(得分:3)

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"})

在jupyter笔记本中为4列的spark数据帧输出的示例:

count_column_types(my_spark_df)

enter image description here

答案 3 :(得分:2)

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

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

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

get_dtype(my_df,'column_name')

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

答案 4 :(得分:1)

您的实际数据和元数据看起来有不同的类型。实际数据的类型为字符串,而元数据为double。

作为解决方案,我建议您使用正确的数据类型重新创建表。

答案 5 :(得分:-4)

我假设您正在寻找您阅读的数据的数据类型。

input_data = [从Mongo DB操作中读取]

您可以使用

type(input_data) 

检查数据类型

相关问题