zoukankan      html  css  js  c++  java
  • 解决ValueError: Some of types cannot be determined by the first 100 rows,

    在spark中试图将RDD转换成DataFrame时,有时会提示ValueError: Some of types cannot be determined by the first 100 rows, please try again with sampling

    原因

    RDD中元素的内部结构是未知的、不明确的,也就是说每个元素里面有哪些字段,每个字段是什么类型,这些都是不知道的,而DataFrame则要求对元素的内部结构有完全的知情权。

    但是在前100行的数据采样过程中还是无法确定字段的类型,所以就会提示这个。

    解决办法

    一、提高数据采样率(sampling ratio)

    sqlContext.createDataFrame(rdd, samplingRatio=0.2)

    其中的samplingRatio参数就是数据采样率,可以先设置为0.2试试,如果不行,可以继续增加。

    该方法的缺点在于,数据抽样确定类型之后,如果后续类型发生变化,则会导致程序崩溃,抽样检测完成还是无法确定类型,依旧会崩溃

    所以就有了下面的解决方案。

    二、显式声明要创建的DataFrame的数据结构,即schema。

      

    #首先引入类型和方法,具体有StructType, StructField, StringType, IntegerType等方法,处理不同的数据类型
    from
    pyspark.sql.types import *
    #构建 schema
    schema = StructType([ StructField("column_1", StringType(), True), StructField("column_2", IntegerType(), True) . . . ])
    #传入声明
    df = sqlContext.createDataFrame(rdd, schema=schema)

    当显式声明schema并应用到createDataFrame方法中后,就不再需要samplingRatio参数了。

    实际开发工程中建议使用显式声明schema的方案,这样可以避免出现因奇葩数据导致的错误。

    作者:旧旧的 <393210556@qq.com> 解决问题的方式,就是解决它一次

  • 相关阅读:
    远程连接ubuntu的MongoDB遇到的坑
    使用google的pprof工具以及在gin中集成pprof
    Erlang垃圾回收机制的二三事
    利用Redis cache优化app查询速度实践
    是财富还是陷阱?如何处理他人的代码
    【译】如何成为一个优秀的开发者
    [译] 你应该升级 MQTT3.1.1 的6个理由
    基于 ANSIBLE 自动化运维实践
    poolboy的坑
    Erlang 内存泄漏分析
  • 原文地址:https://www.cnblogs.com/widgetbox/p/13151166.html
Copyright © 2011-2022 走看看