【问题标题】:get datatype of column using pyspark使用 pyspark 获取列的数据类型
【发布时间】:2017-12-15 10:38:34
【问题描述】:

我们正在从 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'})"

【问题讨论】:

  • 到目前为止你尝试过什么?如果不提供您尝试过但没有奏效的内容,那么这里的任何人都能够帮助您是非常值得怀疑的。请查看“如何创建最小、完整且可验证的示例”stackoverflow.com/help/mcve

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


【解决方案1】:

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

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

你可以使用

type(input_data) 

检查数据类型

【讨论】:

  • 这里不适用。它是 pyspark 特有的。
  • python中使用的该类型函数不适用于pyspark
【解决方案2】:

你的问题很宽泛,所以我的回答也很宽泛。

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

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

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

【讨论】:

  • 您是否愿意用您的信息更新您的问题。不清楚你在问什么@Sreenuvasulu
  • 我的列在这里也有不同的数据类型。
  • 请不要在评论区发布这样的信息。这是不可读的。花点时间写下你的问题。
  • 这与您提出的问题完全不同。您愿意添加一些可重现的示例吗?
  • 除非您提供@desertnaut 要求的信息,否则我不会调查您的问题。你有一个我已经回答的问题,现在这个问题演变成完全不同的东西,你没有努力正确地写出这个问题。请根据 cmets 中讨论的指南查看您的问题。
【解决方案3】:

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

df.schema

【讨论】:

    【解决方案4】:

    看起来您的实际数据和元数据具有不同的类型。实际数据是字符串类型,而元数据是双精度数据。

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

      • 更简洁:dict(df.dtypes)[colname]
      【解决方案6】:
      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 notebook 中 4 列 spark 数据框的示例输出:

      count_column_types(my_spark_df)
      

      【讨论】:

        【解决方案7】:

        df.dtypes 获取(colname, dtype) 对的列表,例如

        [('age', 'int'), ('name', 'string')]
        

        df.schema 获取架构为 StructTypeStructField,例如。

        StructType(List(StructField(age,IntegerType,true),StructField(name,StringType,true)))
        

        df.printSchema() 获取架构的树形视图,例如。

        root
         |-- age: integer (nullable = true)
         |-- name: string (nullable = true)
        

        【讨论】:

          猜你喜欢
          • 2021-12-08
          • 2016-04-14
          • 1970-01-01
          • 1970-01-01
          • 2012-03-31
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 2018-02-19
          相关资源
          最近更新 更多