相关文章推荐
兴奋的草稿纸  ·  如何从spark scala ...·  3 天前    · 
发呆的春卷  ·  spark ...·  3 天前    · 
眉毛粗的木瓜  ·  spark split - CSDN文库·  昨天    · 
冷静的豌豆  ·  Microsoft ...·  5 月前    · 
近视的充电器  ·  学院简介-经济学院·  7 月前    · 
可爱的红烧肉  ·  哥布林动漫 - 百度·  1 年前    · 
spark sql read sqlserver、write carbon报错spark.sql.AnalysisException: unsupported type: BinaryType
最新推荐文章于 2023-10-16 18:57:41 发布
最新推荐文章于 2023-10-16 18:57:41 发布 阅读量 852

还原报错前提User class threw exception: org.apache.spark.sql.AnalysisException: unsupported type: BinaryType;(jdbc读写)

SQL server表user
字段名 字段类型
Filed1 bigint
Filed2 char
Filed3 decimal
Filed4 datetime
Filed5 nvarchar(max)
Filed6 timestamp

Carbon表 person
字段名 字段类型
Filed1 Long
Filed2 string
Filed3 double
Filed4 string
Filed5 string
Filed6 string

tableName = “user”
//方法一:读
val jdbcDF: Dataset[Row] = session.read.format("jdbc")
  .option("url", CommonConfig.SQLSERVER_URL)
  .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
  .option("dbtable", tableName)
  .option("user", CommonConfig.SQLSERVER_USER)
  .option("password", CommonConfig.SQLSERVER_PASSWORD)
  .load()
jdbcDF.show(10)
writeTableName = “person”
//方法二:写
jdbcDF
.write
  .format("carbondata")
  .option("dbName", CommonConfig.CARBONDATA_DBTABLE)
  .option("tableName", writeTableName)
  .option("compress", "true")
  .mode(SaveMode.Overwrite)
  .save()

上面demo适合spark sql 正常识别的字段值

此处读user表报错,原因是spark不识别SQL server的nvarchar(max)、timestamp字段类型

当遇到timestamp、nvarchar(max)等不识别的二进制类型时
read时需要cast转换相应字段类型,并设置table别名

tableName = “(select Filed1, Filed2, Filed3, Filed4, cast(Filed5 as nvarchar(4000)) as Filed5, cast(Filed6 as nvarchar(4000)) as Filed6 from user) temp”

再调用读,可以发现show正常打印数据

写的时候需要转换下,写一个case对象类

case class Person (
                   Filed1: Long,
                   Filed2: String,
                   Filed3: Double,
                   Filed4: String,
                   Filed5: String,
                   Filed6: String

写方法改写具体如下

jdbcDF
  .as[Person]
  .write
  .format("carbondata")
  .option("dbName", CommonConfig.CARBONDATA_DBTABLE)
  .option("tableName", writeTableName)
  .option("compress", "true")
  .mode(SaveMode.Overwrite)
  .save()

完美解决问题

参考文章:
Sql server中的 nvarchar(max) 到底有多大?
针对SQL Server表的spark.read读取错误(通过JDBC连接)

在使用SparkSQL时,当尝试使用MySQL中的数据进行写操作时,可能会遇到 org.apache.spark.sql.AnalysisException 无法解析的错误。在使用SparkSQL连接MySQL之前,首先确保已正确配置数据库连接参数,包括主机名、端口、用户名和密码等。当写入数据时,SparkSQL会根据表的定义和给定的数据进行类型匹配。请仔细检查在写操作中使用的表名和列名的拼写是否正确。请根据实际情况修改上述代码中的连接参数、数据路径、表名等信息,并确保已正确配置MySQL数据库。 解决:org.apache.spark.sql.AnalysisException: Multiple sources found for parquet (org.apache.spark.sql.execution.datasources.v2.parquet.ParquetDataSourceV2, org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat) spark sql在读取hive表时,配置、spark与hive版本、等等很多因素可能会导致操作失败,本随笔就以下异常记录排查方案。 集群环境:HDP3 组件版本:spark2.3.0、hive3.0.0.3.0 ERROR yarn.ApplicationMaster:user class threw exception:org.apache.spark.sql.AnalysisException:Unsupported data source type for direct query on files 遇到如下错误,但是在hive中单独运行,或者是在spark-shell中单独运行的也是毫无问题的,为何偏偏在sparksql中出问题,而且不存在所说的那个 character ’ ’ 。 还有就是我这个临时表本来是采用insert overwrite的也是正确的。 或许应该是,解析有点问题。错误日志: Exception in thread “main” org.apache.spark.sq 1、用./bin/spark-shell启动spark时遇到异常:java.net.BindException: Can't assign requested address: Service 'sparkDriver' failed after 16 retries! 解决方法:add export SPARK_LOCAL_IP="127.0.0.1" to spark-env.... Exception in thread "main" java.sql.SQLException: null,  message from server: "Host '192.168.1.121' is not allowed to connect to this MySQL server"报错原因:mysql服务器不允许远程连接经查找资料,解决方式如下:登录mysql数据库:mysql -ur... spark.sql("select e.empno,e.ename,e.job,e.mgr,e.comm from emp e join dept d on e.deptno = d.deptno") .filter("comm is not null") .write.parquet("/demp"); spark-shell 可以跑的... spark执行过程中偶发性出现错误。 Traceback (most recent call last): File "/dfs/data9/nm-local-dir/usercache/hadoop/appcache/application_1666879209698_29104/container_e26_1666879209698_29104_01_000001/pyspark.zip... 1、报错如下: org.apache.spark.sql.AnalysisException: Detected implicit cartesian product for INNER join between logical plans 解决方式: spark-shell --master yarn --conf spark.sql.crossJoin.enabled=true 问题 User class threw exception: org.apache.spark.sql.AnalysisException: Table or view not found: testtable; line 1 ; 解决办法,引入--files /data0/spark/spark-2.2.1-bin/conf/hive-site.xml 请先检查代码,是否遗漏了字段,也就是要解析的字段XXX不存在。如果真的漏了,补上即可,不需要再往下看了。 具体报错日志如下: ApplicationMaster: User class threw exception: org.apache.spark.sql.AnalysisException: Resolved attribute(s) team_id#51L missing from team_id#479L, … in operator !Join 20/08/25 11:42:08 INFO Client: resolveAppExceptionMsg, msg start 20/08/25 11:42:08 INFO Client: resolveAppExceptionMsg, msg:User class threw exception: org.apache.spark.sql.AnalysisExce...