当前位置: 首页 > 知识库问答 >
问题:

火花SQL'爆炸'命令在AWS EC2上失败,但在本地成功

万俟超
2023-03-14

我正在使用SparkSQL(我提到它在Spark中,以防影响SQL语法——我还不够熟悉,无法确定),我有一个正在尝试重新构建的表。我有一种在本地工作的方法,但是当我尝试在AWS EC2实例上运行相同的命令时,我会收到错误报告,说我有一个“未解析的操作符”

基本上我有这样的数据:

userId    someString      varA   
   1      "example1"     [0,2,5] 
   2      "example2"     [1,20,5] 

我在 varA 上的 sql 上下文中使用“分解”命令。当我在本地运行此命令时,情况会正确返回,但在 AWS 上,它们会失败。

我可以使用以下命令再现它:

val data = List(
  ("1", "example1", Array(0,2,5)), ("2", "example2", Array(1,20,5)))
val distData = sc.parallelize(data)
val distTable = distData.toDF("userId", "someString", "varA")
distTable.registerTempTable("distTable_tmp")
val temp1 = sqlContext.sql("select userId, someString, varA from distTable_tmp")
val temp2 = sqlContext.sql(
  "select userId, someString, explode(varA) as varA from distTable_tmp")

在本地,温度 1.显示() 和温度 2.show() 返回我所期望的内容,即:

scala> temp1.show()
+------+----------+----------+
|userId|someString|      varA|
+------+----------+----------+
|     1|  example1| [0, 2, 5]|
|     2|  example2|[1, 20, 5]|
+------+----------+----------+

scala> temp2.show()
+------+----------+----+
|userId|someString|varA|
+------+----------+----+
|     1|  example1|   0|
|     1|  example1|   2|
|     1|  example1|   5|
|     2|  example2|   1|
|     2|  example2|  20|
|     2|  example2|   5|
+------+----------+----+

但在 AWS 上,temp1 sql上下文命令工作正常,但 temp2 失败并显示以下消息:

scala> val temp2 = sqlContext.sql("select userId, someString, explode(varA) as varA from distTable_tmp")
15/11/05 22:46:49 INFO parse.ParseDriver: Parsing command: select userId, someString, explode(varA) as varA from distTable_tmp
15/11/05 22:46:49 INFO parse.ParseDriver: Parse Completed
org.apache.spark.sql.AnalysisException: unresolved operator 'Project [userId#3,someString#4,HiveGenericUdtf#org.apache.hadoop.hive.ql.udf.generic.GenericUDTFExplode(varA#5) AS varA#6];
...

非常感谢。

共有1个答案

甄正信
2023-03-14

问题的根源是您在EC2上使用的Spark版本。explode函数已在Spark 1.4中引入,因此它无法在1.3.1上工作。可以使用RDDflatMap如下:

import org.apache.spark.sql.Row
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{StructType, StructField, IntegerType}

val rows: RDD[Row] = distTable.rdd.flatMap(
  row => row.getAs[Seq[Int]](2).map(v => Row.fromSeq(row.toSeq :+ v)))
val newSchema = StructType(
  distTable.schema.fields :+ StructField("varA_exploded", IntegerType, true))

sqlContext.createDataFrame(rows, newSchema).show

// userId someString varA                 varA_exploded
// 1      example1   ArrayBuffer(0, 2, 5) 0            
// 1      example1   ArrayBuffer(0, 2, 5) 2            
// 1      example1   ArrayBuffer(0, 2, 5) 5            
// 2      example2   ArrayBuffer(1, 20... 1            
// 2      example2   ArrayBuffer(1, 20... 20           
// 2      example2   ArrayBuffer(1, 20... 5      

但它怀疑这一切值得大惊小怪。

 类似资料:
  • 给定一个spark 2.3数据帧,其中一列包含JSON数组,如何将其转换为JSON字符串的spark数组?或者,等效地,我如何分解JSON,以便输入: 我得到: 非常感谢! p、 数组中条目的形状是可变的。 下面是一个示例输入,如果它是有用的: p. p. s.这不同于迄今为止所有建议的重复问题。例如,如何使用火花数据帧查询JSON数据列?的问题和解决方案适用于(1)数据是所有JSON数据,因此整

  • 我已按照以下指南在本地计算机(Windows 10)上安装spark:https://changhsinlee.com/install-pyspark-windows-jupyter/. 从Anaconda启动笔记本并运行时: 它需要很长时间,而且不会完成(至少在60分钟内)。 在此之前,我收到了错误“java-gage-Process-exited-前…”。阅读此内容后:“https://sta

  • 问题内容: 我有一个包含JSON对象的表。每个JSON对象在方括号中均包含一个数组,并用逗号分隔。 如何使用SQL访问方括号数组中的任何元素,例如“ Matt”? 我在Hadoop上使用“ Hive”。如果您知道如何在SQL中执行此操作,那很好:) 问题答案: 您可以在Hive中执行以下操作: 首先,您需要一个JSON SerDe(Serializer / Deserializer)。我见过的最实

  • 我有以下数据帧,其中包含一些包含数组的列。(我们使用的是火花 1.6) 我期望得到以下结果: 我尝试过横向视图: 但是我得到了一个笛卡尔积,有很多重复。我已经尝试了相同的方法,使用带有列的方法分解所有列,但仍然得到很多重复项 当然,我可以对最终的数据帧进行区分,但这不是一个完美的解决方案。有什么方法可以分解这些列而不得到所有这些副本吗? 谢啦!

  • 问题内容: 我想从包含单词列表的DataFrame转换为每个单词都在其自己行中的DataFrame。 如何在DataFrame中的列上爆炸? 这是我尝试的一些示例,您可以在其中取消注释每个代码行并获取以下注释中列出的错误。我在带有Spark 1.6.1的Python 2.7中使用PySpark。 请指教 问题答案: 和是SQL函数。两者都在SQL上运行。将Java正则表达式作为第二个参数。如果要在

  • 本文向大家介绍JS实现烟花爆炸效果,包括了JS实现烟花爆炸效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了JS实现烟花爆炸的具体代码,供大家参考,具体内容如下 更多JavaScript精彩特效分享给大家: Javascript菜单特效大全 javascript仿QQ特效汇总 JavaScript时钟特效汇总 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊