我需要从Teradata(只读访问)中提取一个表到Scala(2.11)/ Spark(2.1.0).我正在构建一个可以成功加载的数据框
val df = spark.read.format("jdbc").options(options).load()
Run Code Online (Sandbox Code Playgroud)
但是df.show给了我一个NullPointerException:
java.lang.NullPointerException
at org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter.write(UnsafeRowWriter.java:210)
Run Code Online (Sandbox Code Playgroud)
我做了一个df.printSchema,我发现这个NPE的原因是数据集包含列的null值(nullable = false)(看起来Teradata给我错误的信息).实际上,df.show如果我删除有问题的列,我可以实现.
所以,我尝试指定一个新架构,所有列都设置为(nullable = true):
val new_schema = StructType(df.schema.map {
case StructField(n,d,nu,m) => StructField(n,d,true,m)
})
val new_df = spark.read.format("jdbc").schema(new_schema).options(options).load()
Run Code Online (Sandbox Code Playgroud)
但后来我得到了:
org.apache.spark.sql.AnalysisException: JDBC does not allow user-specified schemas.;
Run Code Online (Sandbox Code Playgroud)
我还尝试从前一个创建一个新的Dataframe,指定所需的模式:
val new_df = df.sqlContext.createDataFrame(df.rdd, new_schema)
Run Code Online (Sandbox Code Playgroud)
但是在对数据帧采取行动时我仍然有一个NPE.
关于如何解决这个问题的任何想法?
我有我的主应用程序线程产生2个线程,我在主线程中捕获SIGINT以很好地退出它们.在linux上,我正在使用signal.pause()它,它完美无缺.
在Windows上实现signal.pause()的最佳方法是什么?
我丑陋的解决方案是:
my_queue.get(True, averylongtime)
Run Code Online (Sandbox Code Playgroud)
并在我的信号处理程序中放入my_queue中的内容.请注意,如果我没有指定超时,则不会捕获SIGINT.但我想知道是否有更好的解决方案.
谢谢
使用IYYY和YYYY格式化日期:
SELECT to_char( '2012-12-31'::DATE, 'IYYY-MM-DD' ) AS weird,
to_char( '2012-12-31'::DATE, 'YYYY-MM-DD' ) AS expected;
Run Code Online (Sandbox Code Playgroud)
结果:
weird | expected
------------+------------
2013-12-31 | 2012-12-31
Run Code Online (Sandbox Code Playgroud)
它不会是这个感到惊讶,如果"怪异"的结果是"2013-01-01".
这有什么不对?(PostgreSQL 9.1.7)
apache-spark ×1
dataframe ×1
date ×1
iso ×1
postgresql ×1
python ×1
scala ×1
signals ×1
teradata ×1
windows ×1