看起来我的数据仓库项目明年将转向Teradata(来自SQL Server 2005).
我正在寻找有关Teradata最佳实践的资源 - 从SQL方言的限制到习惯用法以及使查询表现良好的惯例 - 特别是如果它们突出显示与SQL Server 2005明显不同的内容.特别提示类似于SQL的艺术(更注重Oracle).
我的业务流程目前在T-SQL存储过程中,并且非常依赖SQL Server 2005的功能,如PIVOT,UNPIVOT和Common Table Expressions,每月从4TB数据仓库生成大约2700行的输出.
我有这样的事情:
ID Result
1 value1
2 value1
2 value2
3 value1
4 value1
4 value2
4 value3
Run Code Online (Sandbox Code Playgroud)
我想回复这样的事情:
ID Result1 Result2 Result3
1 value1
2 value1 value2
3 value1
4 value1 value2 value3
Run Code Online (Sandbox Code Playgroud)
我搜索了枢轴和连续点和断点,我找不到一个简单明智的解决方案.
TIA
我需要从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.
关于如何解决这个问题的任何想法?
我正在尝试生成一个结果表,其中包含每个课程代码的最后完成课程日期,以及每位员工最后完成的课程代码.以下是我的查询:
SELECT employee_number,
MAX(course_completion_date)
OVER (PARTITION BY course_code) AS max_course_date,
MAX(course_completion_date) AS max_date
FROM employee_course_completion
WHERE course_code IN ('M910303', 'M91301R', 'M91301P')
GROUP BY employee_number
Run Code Online (Sandbox Code Playgroud)
此查询产生以下错误:
3504 : Selected non-aggregate values must be part of the associated group
Run Code Online (Sandbox Code Playgroud)
如果我删除MAX()OVER(PARTITION BY ...)行,查询执行得很好,所以我已经将问题隔离到该行,但在搜索这些论坛和互联网后,我看不到我的意思我做错了.有人可以帮忙吗?
我在SQL Server中有半打视图需要在Teradata中复制,但是我无法找到与SQL元数据表相当的TD.我想复制以下功能(我认为这是相当自我解释的):
select table_name, column_id ordinal_position, column_name,
data_type, char_length char_max_length,
data_precision numeric_precision, data_scale numeric_scale
from user_tab_columns
select name as FUNCTION_NAME
from sys.objects
where type_desc='SQL_SCALAR_FUNCTION'
select TABLE_NAME as VIEW_NAME
from INFORMATION_SCHEMA.VIEWS
Run Code Online (Sandbox Code Playgroud)
我还想知道在线是否有任何可用的Teradata参考资料; 我遇到的一切似乎都是广告而不是实用信息.
我已经尝试了一些我在互联网上看过的例子,但我似乎无法弄明白.这是Teradata数据库.
我有TableA,它有CustomerId和DepartmentId.
我有TableB,也是CustomerId和DepartmentId.
我知道这种结构不实用,但这是一个高度非标准化的数据库,我们从离岸开发团队接管,我们必须使用我们拥有的.
我想要做的是在CustomerId上连接TableA和TableB,然后将TableB的DepartmentId设置为TableA中的内容.我非常感谢正确的语法.
我触及了Teradata.我从未接触过hadoop,但从昨天开始,我正在研究这个问题.通过对两者的描述,它们似乎是可以互换的,但在一些文章中写道它们用于不同的目的.但我发现的一切都是模糊的.我很迷惑.
有谁有经验吗?他们之间有什么严重的区别?
简单示例:我想构建ETL,它将转换数十亿行原始数据并将它们组织成DWH.然后对它们进行一些资源昂贵的分析.为何使用TD?为何选择Hadoop?或者为什么不呢?
在Teradata我可以使用像...这样的声明
collect statistics on my_table column(col1)
Run Code Online (Sandbox Code Playgroud)
这将收集表上的统计信息并将它们存储在DBC视图中,如ColumnStats,IndexStats和MultiColumnStats.我也认为优化器(解析引擎)会在可用时找到统计信息,并使用它们而不是估计的基数/索引值计数来更好地决定如何执行查询.
这听起来很棒,但我有一些问题.
collect stats吗?collect statistics将不胜感激.我正在使用Teradata,我有一张这样的桌子
ID String
123 Jim
123 John
123 Jane
321 Jill
321 Janine
321 Johan
Run Code Online (Sandbox Code Playgroud)
我想查询表,所以我得到了
ID String
123 Jim, John, Jane
321 Jill, Janine, Johan
Run Code Online (Sandbox Code Playgroud)
我试过分区,但可以有很多名字.我如何得到这个结果.甚至,指出我正确的方向将是伟大的.
我试图在单个节点(local [*])上以独立模式通过JDBC访问中型Teradata表(约1亿行).
我正在使用Spark 1.4.1.并且设置在一个非常强大的机器上(2个CPU,24个内核,126G RAM).
我已经尝试了几种内存设置和调整选项,以使其更快地工作,但它们都没有产生巨大的影响.
我确信有一些我缺少的东西,下面是我的最后一次尝试,花了大约11分钟来获得这个简单的计数与使用JDBC连接通过R只需要40秒来获得计数.
bin/pyspark --driver-memory 40g --executor-memory 40g
df = sqlContext.read.jdbc("jdbc:teradata://......)
df.count()
Run Code Online (Sandbox Code Playgroud)
当我尝试使用BIG表(5B记录)时,在完成查询后没有返回任何结果.