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
列的数据类型,可以使用dtypes
ie:
>>> df.dtypes
[('age', 'int'), ('name', 'string')]
Run Code Online (Sandbox Code Playgroud)
这意味着您的列age
属于类型int
且name
属于类型string
.
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)
(请注意,如果有多个同名列,这只会返回第一列的类型)
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)
我不知道你是如何从 mongodb 读取的,但是如果你使用的是 mongodb 连接器,数据类型将自动转换为 spark 类型。要获取 spark sql 类型,只需像这样使用架构属性:
df.schema
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
46903 次 |
最近记录: |