Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark从SAS IOM读取JDBC_Apache Spark_Sas - Fatal编程技术网

Apache spark Spark从SAS IOM读取JDBC

Apache spark Spark从SAS IOM读取JDBC,apache-spark,sas,Apache Spark,Sas,我正在尝试使用Spark JDBC读取SAS IOM。问题是SAS JDBC驱动程序有点奇怪,所以我需要创建自己的方言: object SasDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:sasiom") override def quoteIdentifier(colName: String): String = "\"" + colNa

我正在尝试使用Spark JDBC读取SAS IOM。问题是SAS JDBC驱动程序有点奇怪,所以我需要创建自己的方言:

object SasDialect extends JdbcDialect {
  override def canHandle(url: String): Boolean = url.startsWith("jdbc:sasiom")
  override def quoteIdentifier(colName: String): String = "\"" + colName + "\"n"
}
然而,这还不够。SAS对列标签(=人类可读名称)和列名(=SQL查询中使用的名称)进行了区分,但spark似乎在模式发现中使用列标签而不是名称,请参见下面的JdbcUtils摘录:

while(i
这会导致SQL错误,因为它试图在生成的SQL代码中使用人类可读的列名

要让SAS IOM JDBC正常工作,这需要是getColumnName而不是getColumnLabel。有没有办法用方言来指定它?除了包装整个com.SAS.rio.MVADriver和resultsetmeta,我真的找不到一种方法来连接它


弗兰克

与此同时,我发现了如何做这件事,所以发帖子仅供参考。诀窍是注册你自己的方言,如下所示

此外,SAS用空格填充所有varchar列,因此我修剪所有字符串列

def getSasTable(sparkSession:org.apache.spark.sql.sparkSession,tablename:String):org.apache.spark.sql.DataFrame={
val host:String=“dwhid94.msnet.railb.be”;
val端口:String=“48593”;
val props=new java.util.Properties();
props.put(“用户”、CredentialsStore.getUsername(“sas”))
props.put(“密码”、credentialstore.getPassword(“sas”))
props.setProperty(“driver”、“com.sas.rio.MVADriver”)
val sasconurl:String=String.format(“jdbc:sasiom://%s:%s”,主机,端口);
对象SASASDALYENT扩展JDBCALYENT{
重写def canHandle(url:String):Boolean=url.startsWith(“jdbc:sasiom”)
重写def quoteIdentifier(colName:String):String=“\”“+colName+”\“n”
}                                                                                                                                                           
JDBC方言。registerDialect(SasDialect)
val df=sparkSession.read
.选项(“url”,sasconurl)
.option(“driver”、“com.sas.rio.MVADriver”)
.option(“dbtable”,tablename)
.option(“用户”,CredentialsStore.getUsername(“sas”))
.option(“密码”,CredentialsStore.getPassword(“sas”))
.选项(“fetchsize”,100)
.格式(“jdbc”)
.load()
val strippedDf=sparkSession.createDataFrame(df.rdd.map(r=>Row(r.toSeq.map(x=>x match{case s:String=>s.trim;case =>x})),df.schema);
返回带dF;
}                                                                                                                                                             

请注意,SAS数据集没有
varchar
变量。只有固定长度的字符串和浮点数。这就是为什么如果要存储为varchar而不使用试验空格,则需要修剪值的原因。我也有同样的问题。我想通过JDBC从SAS加载数据。方法
getColumnLabe
while (i < ncols) {
  val columnName = rsmd.getColumnLabel(i + 1)