ValueError: Some of types cannot be determined by the first 100 rows, please try again with sampling
ValueError: Some of types cannot be determined by the first 100 rows, please try again with sampling
在spark中试图将RDD转换成DataFrame时,有时会提示ValueError: Some of types cannot be determined by the first 100 rows, please try again with sampling,此时有2种解决方案:一是提高数据采样率(sampling ratio),二是显式声明要创建的DataFrame的数据结构,即schema。
第一种方案具体做法如下:
sqlContext.createDataFrame(rdd, samplingRatio=0.2)
其中的samplingRatio参数就是数据采样率,可以先设置为0.2试试,如果不行,可以继续增加。
其原理在于,RDD中元素的内部结构是未知的、不明确的,也就是说每个元素里面有哪些字段,每个字段是什么类型,这些都是不知道的,而DataFrame则要求对元素的内部结构有完全的知情权。
比如有一个RDD,其中的元素是dict类型,在使用sqlContext.createDataFrame()方法将该RDD转换成DataFrame的时候,如果括号中没有传入schema参数,那么spark会根据RDD中的前N个元素去猜测元素的内部结构,猜出里面都有哪些字段,每个字段是什么数据类型的。至于N是多少,取决于samplingRatio参数的值,如果不设该参数,则默认取前100个元素。上面代码中设置的samplingRatio是0.2,意味着spark将会取RDD中前20%的元素作为样本去推断元素中各个字段的数据类型。假如运气好,这20%的元素中各个字段都是齐备的,并且能根据字段值判断出该字段的类型,像下图这样:
['name':'Tom', 'age':23, 'gender':'M', 'is_married':False]
['name':'Jerry', 'age':31, 'gender':'F', 'is_married':True]
['name':'John', 'age':27, 'gender':'M', 'is_married':False]
那么spark就能根据上图中的这么多样本元素推断出元素内部有name、age、gender、is_married这几个字段,且字段类型分别是String,Int,String,Boolean,那就不会报任何错误。
但是,如果这20%的元素都缺失了某个字段,像下图这样:
['name':'Tom', 'age':23, 'gender':'M']
['name':'Jerry', 'age':31, 'gender':'F']
['name':'John', 'age':27, 'gender':'M']
本来元素中其实有4个字段的,但是抽样的20%数据里面都缺失了is_married字段,这样就会导致spark误以为元素中只有3个字段,然而当真的按照3个字段来处理时,却又发现后面有其他元素不止这3个字段,这就尴尬了,然后spark觉得自己被耍了,就罢工了。
还有一种情况也会导致spark报错,像下图这样:
['name':'Tom', 'age':23, 'gender':'M', 'is_married':None]
['name':'Jerry', 'age':31, 'gender':'F', 'is_married':None]
['name':'John', 'age':27, 'gender':'M', 'is_married':None]
这种情况下,由于抽样的20%的元素中is_married字段值全都是None,导致spark误以为该字段就是None类型的,当按照None处理时,如果发现后面有元素的is_married字段的值是True或者False,然后spark就崩溃了,不是说好了是None类型拉钩上吊一百年不许变吗?你给我来个True和False是个什么意思?
看到这里,智商超群的你可能已经想到,我主动告诉spark每个RDD元素内部结构是什么样的不就行了吗?没错,这就是我说的第二种方案,显式声明schema。在sqlContext.createDataFrame()方法中,有个参数叫schema,这个参数就是用来告诉spark每个RDD元素的结构的。具体做法是这样的:
from pyspark.sql.types import *
schema = StructType([
StructField("column_1", StringType(), True),
StructField("column_2", IntegerType(), True)
.
.
.
])
df = sqlContext.createDataFrame(rdd, schema=schema)
当你显式声明schema并应用到createDataFrame方法中后,就不再需要samplingRatio参数了。实际开发工程中建议使用显式声明schema的方案,这样可以避免出现因奇葩数据导致的错误。
ValueError: Some of types cannot be determined by the first 100 rows, please try again with sampling的更多相关文章
- 使用DBMS_STATS来收集统计信息【转】
overview Oracle's cost-based optimizer (COB) uses statistics to calculate the selectivity (the fract ...
- Chapter 6 — Improving ASP.NET Performance
https://msdn.microsoft.com/en-us/library/ff647787.aspx Retired Content This content is outdated and ...
- PA教材提纲 TAW12-1
Unit1 Introduction to Object-Oriented Programming(面向对象编程介绍) 1.1 Explaining the Object-Oriented Progr ...
- bottle源码
import sys __author__ = 'Marcel Hellkamp' __version__ = '0.13-dev' __license__ = 'MIT' ############# ...
- Python基础学习(六)
前几天一直在练手廖雪峰老师的python课程,接下来继续学习,由于面向对象编程这一课相对理论便不在此练手,直接上手面向对象高级编程. 一.使用 __slots__ 一般情况下一个class是可以绑定一 ...
- Python面试题之Python面向对象编程汇总
面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的.Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念, ...
- MySQL 5.6 Reference Manual-14.3 InnoDB Transaction Model and Locking
14.3 InnoDB Transaction Model and Locking 14.3.1 InnoDB Lock Modes 14.3.2 InnoDB Record, Gap, and Ne ...
- OpenCV Machine Learning (C++)
/*M/////////////////////////////////////////////////////////////////////////////////////////// IMPOR ...
- 廖雪峰Python电子书总结
函数 1.注意:函数的默认参数必须指向不可变对象 未修改前: def add_end(L=[]): L.append('END') return L 存在的问题:如果连续调用多次,会出现多个 'END ...
随机推荐
- 大数据学习——有两个海量日志文件存储在hdfs
有两个海量日志文件存储在hdfs上, 其中登陆日志格式:user,ip,time,oper(枚举值:1为上线,2为下线):访问之日格式为:ip,time,url,假设登陆日志中上下线信息完整,切同一上 ...
- 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)
本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...
- 成为七牛云 Contributor -如何贡献 logkit 代码
logkit 是 Pandora 开源的一个通用的日志收集工具,可以将不同数据源的数据方便的发送到 Pandora 进行数据分析.除了基本的数据发送功能,logkit 还有容错.并发.监控.删除等功能 ...
- [NOIP2002] 提高组 洛谷P1034 矩形覆盖
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- hdu4405:Aeroplane chess
题目大意:有编号为0-n的格子,从0开始,扔骰子扔到几就走几格.有m个瞬移点,每个点可以从格x直接飞到格y,若瞬移到另一个瞬移点可以继续瞬移.求到达格n的期望扔骰子次数. 题解:期望DP入门好题.网上 ...
- P3366 最小生成树【模板】 洛谷
https://www.luogu.org/problem/show?pid=3366 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包 ...
- 洛谷——P1347 排序
洛谷—— P1347 排序 题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们 ...
- 【纯净版windows系统】U盘启动制作图文教程
无废话,按照步骤来就可以. 1.一个大于4G的U盘(格式化)准备好U盘,请注意制作过程中对U盘有格式化操作,有用的东西请先备份 2.UltraISO(软碟通软件)下载安装百度“软碟通”,或者访问 ht ...
- Java同步锁何时释放?
在测试java多线程中有关 “生产者和消费者” 这个经典问题的时候,写代码测试的时候,思考到一些问题(所以还是要动手,实践才能储真知啊), synchronize 同步锁何时释放,何时获得?重新获得锁 ...
- CentOS里route命令详解
Route 功能简述:linux系统中的route命令能够用于IP路由表的显示和操作.它的主要作用是创建一个静态路由让指定一个主机或者一个网络通过一个网络接口,如eth0.当使用"add&q ...