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> 解决问题的方式,就是解决它一次

  • 相关阅读:
    angular二级联动菜单
    angular 实现自定义样式下拉菜单
    编程思想之回调
    编程思想之递归
    编程思想之迭代器
    阅读源码FluentScheduler
    改变spring-servlet.xml名字和默认位置
    thinkpad X1c 2018 插上电源风扇转速过快的解决办法
    python 和python-m 的区别
    电脑
  • 原文地址:https://www.cnblogs.com/widgetbox/p/13151166.html
Copyright © 2011-2022 走看看