pyspark.sql.utils.ParseException:u“\nextranouse>输入'xxx'应为{'),','}

pyspark.sql.utils.ParseException:u“\nextranouse>输入'xxx'应为{'),','},sql,apache-spark,pyspark,pyspark-sql,Sql,Apache Spark,Pyspark,Pyspark Sql,我有两张主要的桌子:航班和假期 航班由以下列标识:outboundlegid、inboundlegid、agent、querydatetime。适用于该问题的其他列为out_date、in_date。它们指示航班何时起飞和返回日期 和带有“开始”、“结束”和“类型”列的假日 我想确定航班起飞/起飞日期是否与假期表中的任何内容相交 我遵循了来自的一些建议,以确定外出/入住日期是否与任何假期相交 但是,我得到:pyspark.sql.utils.ParseException:u\n异常 输入'out

我有两张主要的桌子:航班和假期

航班由以下列标识:outboundlegid、inboundlegid、agent、querydatetime。适用于该问题的其他列为out_date、in_date。它们指示航班何时起飞和返回日期

和带有“开始”、“结束”和“类型”列的假日

我想确定航班起飞/起飞日期是否与假期表中的任何内容相交

我遵循了来自的一些建议,以确定外出/入住日期是否与任何假期相交

但是,我得到:pyspark.sql.utils.ParseException:u\n异常

输入'outboundlegid'应为{,,'}第35行,位置12。这里有什么问题

文件脚本_2019-02-08-10-46-14.py,第182行,在文件中 /mnt/thread/usercache/root/appcache/application_1549622095592_0002/container_1549622095592_0002_01_000001/pyspark.zip/pyspark/sql/session.py, 第603行,在sql文件中 /mnt/Thread/usercache/root/appcache/application_1549622095592_0002/container_1549622095592_0002_01_000001/py4j-0.10.4-src.zip/py4j/java_gateway.py, 第1133行,在调用文件中 /mnt/thread/usercache/root/appcache/application_1549622095592_0002/container_1549622095592_0002_01_000001/pyspark.zip/pyspark/sql/utils.py, 第73行,在deco pyspark.sql.utils.ParseException中:u\nextranouse 输入'outboundlegid'应为{,,'}行35,位置12\n\n==SQL ==\n\n使用t\n选择\n f.outboundlegid、\n f.inboundlegid、\n f.agent、\n f.querydatetime、\n类型为“假日”和“过期”时的情况 在开始和结束之间\n然后为真\n否则为假\n结束 out\u是假日,\n类型为“长周末”和out\u日期时的情况 在开始和结束之间\n然后为真\n否则为假\n结束 out\u是\u longweekends,\n类型为'HOLIDAY'且in\u日期介于 开始和结束\n然后为真\n否则为假\n结束为假日\n 当type='LONG\u WEEKENDS'和开始和结束之间的开始日期\n 真\n否则假\n结束于\u是\u长周末\n来自f\n交叉航班 加入假日h\n\n选择\n f.*\n t1。外出是假日,\n t1.外出是长周末,\n t1.入内是长周末,\n t1.入内是长周末,\n 从\n选择\n outboundlegid,\n------^^ \n inboundlegid,\n 代理,\n querydatetime,\n在下列情况下 数组\u包含集合\u放样\u为\u假日,为true\n然后为true\n否则 false\n结束\u是\u假日,\n情况是 数组\u包含集合\u放样\u为\u,为真\n然后为真\n ELSE false \n END out \u是\u longweekends,\n当 数组\u containscollect\u setin\u是\u holiday,true\n然后true\n ELSE false\n结束于\u为\u假日,\n情况如下: 数组\u containscollect\u setin\u为\u,为true\n然后为true\n 否则为false\n

这里有什么问题

resultDf = spark.sql("""
    WITH t (
        SELECT  
            f.outboundlegid,
            f.inboundlegid,
            f.agent,
            f.querydatetime,
            CASE WHEN type = 'HOLIDAY' AND (out_date BETWEEN start AND end)
                THEN true
                ELSE false
                END out_is_holiday,
            CASE WHEN type = 'LONG_WEEKENDS' AND (out_date BETWEEN start AND end)
                THEN true
                ELSE false
                END out_is_longweekends,
            CASE WHEN type = 'HOLIDAY' AND (in_date BETWEEN start AND end)
                THEN true
                ELSE false
                END in_is_holiday,
            CASE WHEN type = 'LONG_WEEKENDS' AND (in_date BETWEEN start AND end)
                THEN true
                ELSE false
                END in_is_longweekends
        FROM flights f
        CROSS JOIN holidays h
    )
    SELECT 
        f.*,
        t1.out_is_holiday,
        t1.out_is_longweekends,
        t1.in_is_holiday,
        t1.in_is_longweekends,
    FROM (
        SELECT 
            outboundlegid,   # <<< I am guessing something wrong with this? But Why?
            inboundlegid,
            agent,
            querydatetime,
            CASE WHEN array_contains(collect_set(out_is_holiday), true)
                THEN true
                ELSE false
                END out_is_holiday,
            CASE WHEN array_contains(collect_set(out_is_longweekends), true)
                THEN true
                ELSE false
                END out_is_longweekends,
            CASE WHEN array_contains(collect_set(in_is_holiday), true)
                THEN true
                ELSE false
                END in_is_holiday,
            CASE WHEN array_contains(collect_set(in_is_longweekends), true)
                THEN true
                ELSE false
                END in_is_longweekends
        FROM t
        GROUP BY 
            querydatetime, 
            outboundlegid,
            inboundlegid,
            agent
        LIMIT 100000
    ) t1
    INNER JOIN flights f
    ON t1.querydatetime = f.querydatetime
    AND t1.outboundlegid = f.outboundlegid
    AND t1.inboundlegid = f.inboundlegid
    AND t1.agent = f.agent
    INNER JOIN agents a
    ON f.agent = a.id
    INNER JOIN airports p
    ON f.querydestinationplace = p.airportId
""")

t1.in_后面挂逗号是longweekends和FROM之前的。@user10465355,您可以将其作为答案,我标记为answeredI很高兴它有帮助,但它只不过是一个打字错误,所以我们称之为无法再复制的问题: