Apache spark 如何在使用Spark会话写入数据之前,在启用会话集命令的情况下将数据帧结果写入teradata

Apache spark 如何在使用Spark会话写入数据之前,在启用会话集命令的情况下将数据帧结果写入teradata,apache-spark,apache-spark-sql,teradata,pyspark-dataframes,Apache Spark,Apache Spark Sql,Teradata,Pyspark Dataframes,我的数据具有特殊字符(如笑脸字符、一些垃圾字符)。我想按原样将数据插入到Terdata表中。我可以看到Hive以UTF-8格式存储数据。其中teradata spark数据帧写入失败并出现错误 错误6705翻译过程中遇到非法格式的字符串 为了解决这个问题,我遵循了以下流程 使用DriverManager和ConnectionCreateStatement编写自定义Scala代码 JDBC ConnectionString=JDBC:teradata://connection/DATABASE=d

我的数据具有特殊字符(如笑脸字符、一些垃圾字符)。我想按原样将数据插入到Terdata表中。我可以看到Hive以UTF-8格式存储数据。其中teradata spark数据帧写入失败并出现错误

错误6705翻译过程中遇到非法格式的字符串

为了解决这个问题,我遵循了以下流程

  • 使用DriverManager和ConnectionCreateStatement编写自定义Scala代码
  • JDBC ConnectionString=JDBC:teradata://connection/DATABASE=dbname,字符集=UTF-8,列名称=ON,MAYBENULL=ON

  • 在写入实际数据之前,请启用会话命令-
  • 在上设置会话字符集UNICODE传递

  • 会话命令执行成功后,将实际数据写入teradata表
  • 但我想知道,在将数据帧数据写入teradata表之前,是否有可能启用会话级命令

    我可以在dataframe选项方法中使用会话级别集语句吗? 像

    table_df.write.format(“jdbc”).option(“url”,jdbcurl”).option(“dbtable”,tablename)。option(“dbname”,dbname)。option(“username”,user)。option(“password”,password)


    请提供您对此的想法。谢谢

    您可以指定Teradata JDBC驱动程序的
    RUNSTARTUP=on
    连接参数,并在数据库用户的
    STARTUP
    子句中指定
    SET SESSION CHARACTER SET UNICODE PASS-THROUGH on
    命令

    有关详细信息,请参阅Teradata JDBC驱动程序用户指南中标题为“用户启动SQL请求”的部分:


    如果目标表中的相应列未使用适当的字符集定义,则会话选项对您没有任何好处。为什么要将您描述的内容存储为垃圾字符?我认为在Pyspark中,您可以对数据帧进行ansi编码并去除垃圾。感谢@Andrew的回复-我的表列已在UNICODE字符集中,但作业仍然失败,这里是垃圾字符,例如-标准键盘中没有的字符,例如-Register Symbol®和与普通引号(')不同的单引号(')。我们需要按原样存储和显示给最终用户,而不需要跳过任何字符。我可以通过使用自定义Terdata插入而不是通过Pyspark来实现这一点。我不应该跳过任何字符。不幸的是,
    write
    方法当前不支持
    选项(“sessionInitStatement”、“…”)
    正如
    read
    所做的那样。@Fred非常感谢您提供的信息。看起来它已经开放了一年。希望问题很快就会解决。我将进一步监控这个问题,并在看到任何解决方案后在这里更新。谢谢Hanks Tom。通过添加RUNSTARTUP=ON并将会话集命令添加到username中来解决这个问题。我可以看到结果按预期在Teradata表中显示。