gpt4 book ai didi

mysql - Spark SQL : query with case and thousands of columns

转载 作者:行者123 更新时间:2023-11-30 22:42:39 25 4
gpt4 key购买 nike

我有一个包含两千列的表格。我需要根据标志列修改几列数据。

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 以及原始列。我如何根据标志列获取所有具有修改列(费用,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 并且您像编写查询一样编写查询

select *,case when flag1 = 'A' then null else charges end as charges, flag2 = 'B' then null then else stax end as stax from customer

这将为您提供 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 保持原样(旧)。您案件的税费(新)结果。

希望这会有所帮助。

关于mysql - Spark SQL : query with case and thousands of columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30682893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com