我有一个带有Spark 2.4.4和python 2.7.16的EMR(emr-5.28.0)。
如果我SSH到集群并像这样执行pyspark:
pyspark --jars /home/hadoop/jar/spark-redshift_2.11-2.0.1.jar,/home/hadoop/jar/spark-avro_2.11-4.0.0.jar,/home/hadoop/jar/minimal-json-0.9.5.jar,/usr/share/aws/redshift/jdbc/RedshiftJDBC.jar --packages org.apache.spark:spark-avro_2.11:2.4.4
并执行以下代码:
url = "jdbc:redshift://my.cluster:5439/my_db?user=my_user&password=my_password"
query = "select * from schema.table where trunc(timestamp)='2019-09-10'"
df = sqlContext.read.format('com.databricks.spark.redshift')\
.option("url",url)\
.option("tempdir","s3a://bucket/tmp_folder")\
.option("query",query)\
.option("aws_iam_role","arn_iam_role")\
.load()
一切正常,我可以使用该df。 但是,如果我在相同的EMR中使用相同版本的所有东西打开Zeppelin笔记本,并使用以下命令执行一个单元格:
%dep
z.load("/home/hadoop/jar/spark-redshift_2.11-2.0.1.jar")
z.load("/home/hadoop/jar/spark-avro_2.11-4.0.0.jar")
z.load("/home/hadoop/jar/minimal-json-0.9.5.jar")
z.load("/usr/share/aws/redshift/jdbc/RedshiftJDBC.jar")
z.load("org.apache.spark:spark-avro_2.11:2.4.4")
在下一个单元格中,使用相同的代码段(以%pyspark
开头),当我尝试执行df.count()时,出现以下错误:
java.lang.ClassCastException: cannot assign instance of scala.collection.immutable.List$SerializationProxy to field org.apache.spark.rdd.RDD.org$apache$spark$rdd$RDD$$dependencies_ of type scala.collection.Seq in instance of org.apache.spark.rdd.MapPartitionsRDD
我多次尝试重新启动解释器,并且尝试将ssh时在控制台中使用的--jar
选项添加到解释器args,但是没有运气。
有什么想法吗?