SPARK SQL 不在或不存在
Posted
技术标签:
【中文标题】SPARK SQL 不在或不存在【英文标题】:SPARK SQL not in or NOT EXISTS 【发布时间】:2017-11-06 11:34:58 【问题描述】:我有一个场景,其中有两张表(csv)。为它创建了两个表。 当有一个好的数据时,我可以将它与第二个表中的值(id 统计值)映射。如果我有错误的数据,我应该再次将其映射到 id 统计值(但值不同)。但是,我无法在 spark SQL 中使用 not exists 。我得到以下错误:
不匹配的输入 'from' 期望 、'WHERE'、'GROUP'、'ORDER'、'HAVING'、'LIMIT'、'LATERAL'、'WINDOW'、'UNION'、'EXCEPT'、'INTERSECT' , 'SORT', 'CLUSTER', 'DISTRIBUTE'(第 1 行,位置 386)
at org.apache.spark.sql.catalyst.parser.ParseException.withCommand(ParseDriver.scala:197)
at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parse(ParseDriver.scala:99)
at org.apache.spark.sql.execution.SparkSqlParser.parse(SparkSqlParser.scala:45)
代码:
select
a.ptf_id,a.ptf_code,a.share_id,a.share_code,a.bench_id,a.bench_code
, a.l1_calculation_date,a.l1_begin_date,a.l1_end_date,a.l1_running_date
, a.l1_frequency,a.l1_calculation_step,a.l1_performance_currency
, a.l1_configuration,a.l1_valuation_source,a.l1_nav_valuation_type
, a.l1_setting_reference_type, a.l1_setting_valuation_type
, a.l1_sharpe_ratio_annualized as value,b.id_statistic
from
parquetFile a,
pairRDD b,
stats c
where
a.l1_nav_valuation_type= b.l1_nav_valuation_type
and a.l1_valuation_source = b.l1_valuation_source
and b.l1_Perf = 'l1_sharpe_ratio_annualized'
OR (a.ptf_id not EXISTS (
select e.ptf_id from pairRDD d, parquetFile e
where d.l1_valuation_source = e.l1_valuation_source
AND d.l1_nav_valuation_type = e.l1_nav_valuation_type)
and b.l1_valuation_source ='')
如果我使用“NOT in”,此查询在 SQL 中有效 请帮助我了解在这种情况下使用的其他选项,而不是不存在。
【问题讨论】:
一种选择是使用外连接;坦率地说,您的查询有点难以阅读,但我想说您应该能够使用联接对其进行转换。祝你好运。 【参考方案1】:查询 有点难以理解。目前尚不清楚(无论如何对我而言)您对 stats 表的意图是什么,因为您没有从中选择任何内容,因此我将其删除。显然我自己没有尝试过,但乍一看,你可能会尝试这样的事情:
select
a.PTF_ID,
a.PTF_CODE,
a.SHARE_ID,
a.SHARE_CODE,
a.BENCH_ID,
a.BENCH_CODE,
a.L1_CALCULATION_DATE,
a.L1_BEGIN_DATE,
a.L1_END_DATE,
a.L1_RUNNING_DATE,
a.L1_FREQUENCY,
a.L1_CALCULATION_STEP,
a.L1_PERFORMANCE_CURRENCY,
a.L1_CONFIGURATION,
a.L1_VALUATION_SOURCE,
a.L1_NAV_VALUATION_TYPE,
a.L1_SETTING_REFERENCE_TYPE,
a.L1_SETTING_VALUATION_TYPE,
a.L1_SHARPE_RATIO_ANNUALIZED as VALUE,
b.ID_STATISTIC
from
PARQUETFILE a
inner join
PAIRRDD b
on
a.L1_NAV_VALUATION_TYPE = b.L1_NAV_VALUATION_TYPE and
a.L1_VALUATION_SOURCE = b.L1_VALUATION_SOURCE
left outer join (
select
e.PTF_ID
from
PAIRRDD d
inner join
PARQUETFILE e
on
d.L1_VALUATION_SOURCE = e.L1_VALUATION_SOURCE AND
d.L1_NAV_VALUATION_TYPE = e.L1_NAV_VALUATION_TYPE
where
b.L1_VALUATION_SOURCE = ''
) x
on
a.PTF_ID = x.PTF_ID
where
b.L1_PERF = 'l1_sharpe_ratio_annualized' or
x.PTF_ID is null
【讨论】:
谢谢@dgg。它确实解决了我的目的。并进一步为需求添加了更多逻辑。如果有人面临同样的问题并需要帮助。请告诉我。以上是关于SPARK SQL 不在或不存在的主要内容,如果未能解决你的问题,请参考以下文章