我正在使用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];
...
非常感谢。
问题的根源是您在EC2上使用的Spark版本。explode
函数已在Spark 1.4中引入,因此它无法在1.3.1上工作。可以使用RDD
,flatMap
如下:
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时钟特效汇总 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊