我们有这个庞大的遗留sql表,我们需要从中提取数据并将其推送到s3。以下是我查询部分数据和编写输出的方法。
def writeTableInParts(tableName: String, numIdsPerParquet: Long, numPartitionsAtATime: Int, startFrom : Long = -1, endTo : Long = -1, filePrefix : String = s3Prefix) = {
val minId : Long = if (startFrom > 0) startFrom else findMinCol(tableName, "id")
val maxId : Long = if (endTo > 0) endTo else findMaxCol(tableName, "id")
(minId until maxId by numIdsPerParquet).toList.sliding(numPartitionsAtATime, numPartitionsAtATime).toList.foreach(list => {
list.map(start => {
val end = math.min(start + numIdsPerParquet, maxId)
sqlContext.read.jdbc(mysqlConStr,
s"(SELECT * FROM $tableName WHERE id >= ${start} AND id < ${end}) as tmpTable",
Map[String, String]())
}).reduce((left, right) => {
left.unionAll(right)
})
.write
.parquet(s"${filePrefix}/$tableName/${list.head}-${list.last + numIdsPerParquet}")
})
}
这适用于许多不同的表,但无论出于何种原因,无论我减少扫描窗口或大小,表都会继续获得java.nio.channels.ClosedChannelException
。
根据this回答我想我的代码中有异常,但我不知道它会在哪里,因为它是一个相当简单的代码。如何进一步调试此异常?原木没有任何非常好的东西,也没有显示原因。
答案 0 :(得分:0)
问题是由于以下错误,而不是火花相关......追逐这个问题非常麻烦,因为火花并不能很好地显示错误。织补...
'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp error