Pyspark

It appears that you are attempting to reference SparkContext from a broadcast " Exception: It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transforamtion. SparkContext can only be used on the driver, not in code that it run on workers. For more information, see SPARK-5063.
 
这是因为我def了一个函数,在里面引用了外部的一个SparkContext,这个SparkCotext并没有关闭;于是在def里面又重新定义了一个SparkContext,来处理后续处理
 
KeyError: 'SPARK_HOME'
需要在使用SparkContext之前声明:
os.environ['SPARK_HOME'] = '/opt/cloudera/parcels/CDH/lib/spark'
 
SyntaxError: Non-ASCII character '\xef' in file 错误解决
在文件头添加上
# -*- coding: UTF-8 -*-
即可,保证编码是UTF8的编码;否则如果有中文等特殊字符的文件,保存后格式将会出现异常
 
'dict' object has no attribute 'setIfMissing'
之前采用conf='''{...}'''的写法,这种写法其实就是一个字典,所以没有setIfMissing函数(只有SparkConf里面才有setIfMissing函数);后来改变为conf.set("spark.speculation", "false")方式,但是又发现了下面的错误:
'SparkConf' object has no attribute 'items'
后来修改了方式,不再向SparkContext中传入配置文件,而是在最后saveAsNewDataSet中传入的时候再传入json格式的config
 
再后来发现--jars方式引入的jar无法在def函数中进行使用;于是改用了for的方式,但是这个时候,里面定义新的SparkContext有发生的问题:
Cannot run multiple SparkContexts at once;
于是有修改for语句中的sparkContext为for外部的那个已经定义的SparkContext
 
java.lang.ClassCastException: java.lang.String cannot be cast to java.util.ArrayList
sc.parallelize([sys.argv[3:]]).map(lambda x: (x[0], x)),这个异常是因为对于这句话的理解,因为早期我做的是一条记录的插入,所以脑海中始终以为parallelize里面就是一个数组,或者说只接受一个数组,但是其实[parm[0:]]的真实含义是数组的元素是一个数组;你可以理解为接收的一个行的集合,内部数组的每个元素都对应一列,外部数组每个元素都对应一行。lambda x: (x[0], x)其实就是一个以rowkey(x[0])作为主键,其他元素x(x是一个多维数组,每个维度代表一列)作为value的组织形式。
参看一下我之前报错的时候的写法:
sc.parallelize([rowNum, column_family, column_quality, value]).map(lambda x: (x[0], x)),其实Convert接收的一个多为数组,但是如果是上述定义,参数是String。
解决的方式:百思不得其解之际,因为有成功案例(只不过对于成功案例理解不深),于是我尝试仿照成功案例的写法,而不是自己的理解的写法,将sc.parallelize([rowNum, column_family, column_quality, value])改写为:
 
parm=[rowNo, column_family, quality_column, value]
sc.parallelize([parm[0:]]).map(lambda x: (x[0], x))
一运行,发现OK了。

posted on 2017-08-19 22:04  张叫兽的技术研究院  阅读(1264)  评论(0编辑  收藏  举报

导航