Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Spark SQL中的Case When语句中列出_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 在Spark SQL中的Case When语句中列出

Scala 在Spark SQL中的Case When语句中列出,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我正在尝试将数据帧从长转换为宽 然而,SQL似乎将国家列表误解为表中的变量。下面是我从控制台看到的消息以及上面链接中的示例数据和代码。有人知道如何解决这些问题吗 来自scala控制台的消息: scala>val myDF1=sqlc2.sql(查询) org.apache.spark.sql.AnalysisException:无法解析给定输入列>id、标记、值的“US” id标记值 1美元50 1英国100 1罐125 2美元75 2英国150 2罐175 我想: 我们英国可以吗 1 50

我正在尝试将数据帧从长转换为宽 然而,SQL似乎将国家列表误解为表中的变量。下面是我从控制台看到的消息以及上面链接中的示例数据和代码。有人知道如何解决这些问题吗

来自scala控制台的消息:
scala>val myDF1=sqlc2.sql(查询)
org.apache.spark.sql.AnalysisException:无法解析给定输入列>id、标记、值的“US”

id标记值
1美元50
1英国100
1罐125
2美元75
2英国150
2罐175
我想:
我们英国可以吗
1   50  100  125
2   75  150  175
我可以创建一个包含我想要透视的值的列表,然后创建一个包含我需要的sql查询的字符串。
val国家=列表(“美国”、“英国”、“加拿大”)
val numCountries=国家/地区。长度-1
var query=“选择*,”

对于(i国家/地区代码是文字,应该用引号括起来,否则SQL解析器会将其视为列的名称:

val caseClause = countries.map(
    x => s"""CASE WHEN tag = '$x' THEN value ELSE 0 END as $x"""
).mkString(", ")

val aggClause = countries.map(x => s"""SUM($x) AS $x""").mkString(", ")

val query = s"""
   SELECT id, $aggClause
   FROM (SELECT id, $caseClause FROM myTable) tmp
   GROUP BY id"""

sqlContext.sql(query)
问题是为什么还要从头开始构建SQL字符串

def genCase(x: String) = {
  when($"tag" <=> lit(x), $"value").otherwise(0).alias(x)
}

def genAgg(f: Column => Column)(x: String) = f(col(x)).alias(x)

df
 .select($"id" :: countries.map(genCase): _*)
 .groupBy($"id")
 .agg($"id".alias("dummy"), countries.map(genAgg(sum)): _*)
 .drop("dummy")
def genCase(x:String)={
当($“标记”亮起(x),$“值”)。否则(0)。别名(x)
}
def genAgg(f:Column=>Column)(x:String)=f(col(x))。别名(x)
df
.select($“id”::countries.map(genCase):\ux*)
.groupBy($“id”)
.agg($“id”.alias(“dummy”),countries.map(genAgg(sum)):*)
.drop(“dummy”)
def genCase(x: String) = {
  when($"tag" <=> lit(x), $"value").otherwise(0).alias(x)
}

def genAgg(f: Column => Column)(x: String) = f(col(x)).alias(x)

df
 .select($"id" :: countries.map(genCase): _*)
 .groupBy($"id")
 .agg($"id".alias("dummy"), countries.map(genAgg(sum)): _*)
 .drop("dummy")