我有一张两千列的表格。我需要根据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)的所有列。
答案 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(新)结果。
希望这会有所帮助。