我们正在阅读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
实际上我们没有为mongo集合的任何列定义数据类型。
当我从pyspark dataframe
dataframe.count()
我有这样的例外
"Cannot cast STRING into a DoubleType (value: BsonString{value='200.0'})"
答案 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)
答案 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)
检查数据类型