Spark sql:用case和数千列查询

时间:2015-06-06 12:31:16

标签: mysql apache-spark apache-spark-sql cloudera-cdh

我有一张两千列的表格。我需要根据flag列修改几列数据。

tableSchemaRDD.registerAsTable("customer")
var results = sqlContext.sql("select *,case when flag1 = 'A' then null else charges end as charges, flag2 = 'B' then null then else stax end as stax from customer")  

flag1,flag2,charges,stax是我表中的列。上面的代码将提供额外的两个coumns以及原始列。如何根据标志列获取包含修改列(charge,stax)的所有列。

1 个答案:

答案 0 :(得分:0)

不要使用星号(*),实际上星号告诉你必须带上所有列,之后你使用两个负责两个新列的情况。您只需删除星号(*)并将列名称以逗号分隔,而不使用您要修改的列名称。这样就不会显示那两个旧列。 如果你使用的是Spark 1.3,那么它很容易用于DataFrame,比如

val columsNames = df.schema.fieldNames
  .filter(fieldName => {
    !fieldName.equals("charges") && !fieldName.equals("stax")
  }).mkString(",")

不要完全记住SchemaRDD中是否有方法/属性。

<强>编辑: 只需了解这个问题,asterisk告诉你带上所有旧列,然后你又使用了两个新的情况(两个新的列。),在你的场景中你必须指定带有名字而没有费用和stax的列,因为这些是你的新列那些将由案件填充。

假设您有一个包含4列的表客户,ID名称收费stax并且您编写的查询就像您正在编写

  

选择*,例如当flag1 ='A'时为null,否则收费结束为收费,flag2 ='B'然后为null然后stax end为来自客户的stax

这将为您提供6列,4为星号(*),因为表中有四列。和2你的情况。而不是星号(*),你必须像

一样查询
select id , name ,case when flag1 = 'A' then null else charges end as charges, flag2 = 'B' then null then else stax end as stax from customer

这将产生4列,id,name,因为它们是(OLD)。您的案件的Stax和Charges(新)结果。

希望这会有所帮助。