Mysql Spark sql:带有大小写和数千列的查询
我有一张有两千列的表。我需要根据标志列修改一些列数据Mysql Spark sql:带有大小写和数千列的查询,mysql,apache-spark,apache-spark-sql,cloudera-cdh,Mysql,Apache Spark,Apache Spark Sql,Cloudera Cdh,我有一张有两千列的表。我需要根据标志列修改一些列数据 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、
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是我表格中的列。上面的代码将提供额外的两个coumn以及原始列。如何根据标志列获取所有具有修改列(费用、stax)的列 不要使用星号(*),实际上星号告诉您必须带上所有列,然后您将使用负责两个新列的两个案例。您只需删除星号(*),并将列名以逗号分隔,而不包含要修改的列名。这样就不会显示这两个旧列。
如果您使用的是Spark 1.3,那么对于DataFrame来说非常容易,比如
val columsNames = df.schema.fieldNames
.filter(fieldName => {
!fieldName.equals("charges") && !fieldName.equals("stax")
}).mkString(",")
不要完全记住SchemaRDD中是否有方法/属性
编辑:
请理解这个问题,星号告诉你带上所有的旧列,然后你使用两个新的案例(两个新的列)。另外,在你的场景中,你必须指定列,列的名称不含费用和stax,因为这些是你的新列,它们将由案例填充
假设您有一个表customer,它有4列,id name charges stax,并且您像编写查询一样编写查询
选择*,当flag1='A'然后null else费用作为费用结束,flag2='B'然后null然后else stax结束作为客户的stax结束时的情况
这将为您提供6列,4列表示星号(*),因为表中有四列。你的案子有两个。除了星号(*),您必须像
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原样(旧)。您的案件的Stax和费用(新)结果
希望这会有所帮助。出现了非常非常严重的问题。您能发布什么是表结构以及您期望的输出吗?您使用的是哪种spark版本?我使用的是spark 1.2。没问题,如果您知道架构,即列名,那么只需使用逗号分隔的名称,而不是星号。看我编辑的帖子。你也可以用schemaRDD做同样的事情。我也检查过了,