我如何使用 s & $ 访问 Pyspark 中的变量,就像在 Scala 中一样

Posted

技术标签:

【中文标题】我如何使用 s & $ 访问 Pyspark 中的变量,就像在 Scala 中一样【英文标题】:How can i access variable in Pyspark just like in Scala by using s & $ 【发布时间】:2018-09-25 14:47:44 【问题描述】:

我在下面有一个代码,用于将数据从 HIVE 表复制到 HDFS,以附加模式作为 Parquet 文件。

from pyspark.sql.functions import current_date, date_format, date_sub
from datetime import datetime, timedelta
import datetime
q = """select label_yyyy_mm_dd
        ,label_yyyy_mm
        ,q_media_name
        ,a_accepted
        ,a_end_ts
        ,a_media_name
        ,a_resource_name
        ,a_start_ts
        ,k_callpurpose
        ,k_srf
        ,q_entry_ordinal
        ,q_interaction_id
        ,q_interaction_type
        ,q_ixn_resource_id
        ,q_resource_name
        ,a_consult_rcv_warm_engage_time
        ,a_consult_rcv_warm_hold_time
        ,a_consult_rcv_warm_wrap_time
        ,a_customer_handle_count
        ,a_customer_talk_duration
        ,a_interaction_resource_id
        ,a_interaction_id
        ,a_wrap_time
        a_technical_result
        ,k_ixn_type
        ,k_ixn_type_source
        ,k_transfer_count
        ,k_language
        ,k_agentauth
        ,k_auth,k_rg
        ,k_channel
        ,k_gms_result
        ,k_connid
        ,k_rbcprimaryid
        ,k_agent_id
        ,a_interaction_resource_ordinal 
    from prod_T0V0_cct0.cct0_gim_measures_gold A 
    inner join prod_T0V0_cct0.yle0_gim_date_time B on A.a_start_date_time_key = B.date_time_key 
    where label_yyyy_mm_dd = date_format(date_sub(current_date(), 1), 'y-MM-dd')
  """
date = (datetime.date.today()-datetime.timedelta(days=1)).strftime('%Y-%m-%d')
spark.sql(q).write.mode('append').parquet('hdfs:/prod/11323/app/H9A0/data/T0V0/DIG/info_gold_chat.parquet/label_yyyy_mm_dd=$date')

需要根据变量“日期”的值创建文件夹来移动镶木地板文件。但是,这会引发语法错误,因为我可以理解上面的路径有 's' 和 '$' 用于 Scala 而不是 Pyspark。我尝试删除它们,但它可以工作,但是文件进入并位于文件夹名称“日期”中,我认为它被视为常量而不是变量值。

有人可以帮助我如何将镶木地板文件写入文件夹 名称为 Day-1 (%y-%m-%d) 格式?

【问题讨论】:

显示您收到的确切错误消息。 Edit这个问题并正确格式化代码和消息,以便它实际上是可读的。 【参考方案1】:

问题出在最后一行,我已经在 Pyspark shell 中测试了数据,它给出了正确的结果。在 PySpark 的最后一行使用正确的字符串格式,如下所示:

date = (datetime.date.today()-datetime.timedelta(days=1)).strftime('%Y-%m-%d')

date # Testing the date value in PySpark Shell.
'2018-09-24'

spark.sql(q).write.mode('append').parquet('hdfs:/prod/11323/app/H9A0/data/T0V0/DIG/info_gold_chat.parquet/label_yyyy_mm_dd=%s' %date')

【讨论】:

文件“”,第 45 行 spark.sql(q).write.mode('append').parquet('hdfs:/prod/11323/app /H9A0/data/T0V0/DIG/info_gold_chat.parquet/label_yyyy_mm_dd=%s' %date') ^ 语法错误:扫描字符串时 EOL spark.sql(q).write.mode('append').parquet('hdfs:/prod/11323/app/H9A0/data/T0V0/DIG/info_gold_chat.parquet/label_yyyy_mm_dd= %s' %date) 有多余的引号,删除它..请现在重试。我在本地测试过:test = 'hdfs:/prod/11323/app/H9A0/data/T0V0/DIG/info_gold_chat.parquet/label_yyyy_mm_dd=%s' %date >>> 测试'hdfs:/prod/11323/app/H9A0/data/T0V0/DIG/info_gold_chat.parquet/label_yyyy_mm_dd=2018-09-24' 是的,它成功了...我从之后的日期中删除了 '。非常感谢先生!

以上是关于我如何使用 s & $ 访问 Pyspark 中的变量,就像在 Scala 中一样的主要内容,如果未能解决你的问题,请参考以下文章

使用空格访问类属性

如何在 Laravel 5 中访问刀片中的 URL 段?

如何在pyspark中将GUID转换为整数

如何覆盖两个数据帧以获得如下结果

如何使用 pyiCloud 访问 iCloud 笔记

如何使用他们的 API 访问 Google Clas-s-room 中的“等级类别”