当前位置: 首页 > 知识库问答 >
问题:

在配置单元上交叉应用SQL Server查询

薛栋
2023-03-14

HDP-2.5.0.0,使用Ambari 2.4.0.1

配置单元表ReportSetting如下:

id int

serializedreportsetting String

列'SerializedReportSetting'在源SQL Server db中是一种XML数据类型,但在Sqoop导入期间被转换为String,这是它在SQL Server中的外观:

<ReportSettings4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Trigger>
  <Manual>true</Manual>
  </Trigger>
<StartTime>
    <Year>8</Year>
    <Month>1</Month>
    <Day>1</Day>
    <Hour>0</Hour>
    <Minute>0</Minute>
  </StartTime>
  <ReportPeriod>
    <Month>0</Month>
    <Day>0</Day>
    <Hour>0</Hour>
    <Minute>5</Minute>
  </ReportPeriod>
  <Theft>
    <DigitalInput>true</DigitalInput>
    <Can>false</Can>
  </Theft>
  <SequenceNo>0</SequenceNo>
</ReportSettings4>

在配置单元表中:

<ReportSettings4 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Trigger><Manual>true</Manual></Trigger><StartTime><Year>8</Year><Month>12</Month><Day>31</Day><Hour>23</Hour><Minute>34</Minute></StartTime><ReportPeriod><Month>0</Month><Day>0</Day><Hour>4</Hour><Minute>0</Minute></ReportPeriod><Theft><DigitalInput>false</DigitalInput><Can>false</Can></Theft><SequenceNo>3</SequenceNo></ReportSettings4>

在SQL Server上正常工作的查询:

SELECT
r.VehicleId
,rs.value('(Trigger/Manual)[1]', 'bit') AS RS_Trigger_Manual, ,CAST(CONCAT(CASE WHEN rs.value('(StartTime/Year)[1]', 'int') < 10 THEN CONCAT('200',rs.value('(StartTime/Year)[1]', 'int')) ELSE CONCAT('20',rs.value('(StartTime/Year)[1]', 'int')) END,'-',rs.value('(StartTime/Month)[1]', 'int'),'-',rs.value('(StartTime/Day)[1]', 'int'),' ',rs.value('(StartTime/Hour)[1]', 'int'),':',rs.value('(StartTime/Minute)[1]', 'int'),':','00.000') AS datetime) AS RS_StartTime
,rs.value('(ReportPeriod/Month)[1]', 'int') AS RS_ReportPeriod_Month
,rs.value('(ReportPeriod/Day)[1]', 'int') AS RS_ReportPeriod_Day
,rs.value('(ReportPeriod/Hour)[1]', 'int') AS RS_ReportPeriod_Hour
,rs.value('(ReportPeriod/Minute)[1]', 'int') AS RS_ReportPeriod_Minute
,rs.value('(Theft/DigitalInput)[1]', 'bit') AS RS_Theft_DigitalInput
,rs.value('(Theft/Can)[1]', 'bit') AS RS_Theft_Can,rs.value('(SequenceNo)[1]', 'int') 

AS RS_SequenceNo FROM ReportSetting r
  CROSS APPLY SerializedReportSetting.nodes('/*') AS ReportSettings(rs)

从ReportSetting限制1中选择xpath(SerializedReportSetting,'/trigger/manual');

************更新-1**********

我使用regexp_replace来处理上面的问题:

SELECT id,
  xpath_string(SerializedReportSetting,'/ReportSettings/Trigger/Manual')        AS RS_Trigger_Manual,
  xpath_string(SerializedReportSetting,'/ReportSettings/Trigger/DriveChange')   AS RS_Trigger_DriveChange
FROM
  (SELECT id,
    regexp_replace(SerializedReportSetting, 'ReportSettings+\\d','ReportSettings') AS SerializedReportSetting
  FROM reportsetting
  WHERE id IN (1701548,3185,1700231,1700232)
  ) reportsetting_regex;

共有1个答案

庄弘业
2023-03-14

在xpath中,它们显式地表示:

XPath()函数始终返回一个字符串配置单元数组。如果表达式产生非文本值(例如,另一个xml节点),则函数将返回一个空数组

因此,您可以使用:XPath(SerializedReportSettings,'/reportSettings4/trigg er/manual/text()')来自ReportSetting限制1;

xpath_short、xpath_int、xpath_long这些函数返回一个整数数值,如果没有找到匹配项,则返回零值,或者找到匹配项但值不是数值。支持数学运算。如果值溢出返回类型,则返回该类型的最大值。

xpath_int(SerializedReportSettings,'/reportSettings4/reportPeriod.mont')来自ReportSetting限制1;

 类似资料:
  • “无法加载db驱动程序类:com.microsoft.sqlserver.jdbc.sqlserverdriver” 有什么想法如何构造连接字符串吗?考虑servername=servername。

  • 问题内容: 我一直在尝试查找有关我的查询的问题。该查询实际上是由HQL的hibernate生成的,但是生成的SQL并没有达到我的期望。稍微修改SQL会产生正确的结果,但是我不确定为什么修改会有所不同。 原始查询(不返回任何行) 修改的查询-用逗号替换交叉联接(隐式交叉联接) 返回一行 我的理解可能是错误的,因为写作与Writing相同。所以我不明白为什么查询返回不同的结果。 与导致此问题的第一个查

  • 我使用Hortonworks Hadoop HDP-2.3.2.0-2950 Hive over Tez引擎 下面2个查询来自Java代码。 ——运行良好 ——失败并出现错误 我的代码:

  • 找到那个预定红绿船的水手了吗?相交 我知道intersect在mysql中不起作用,所以我正在寻找替代方案

  • 当我运行以下配置单元命令时 hive-e‘选择msg,将(*)从表中计数为cnt,其中像“%abcd%”这样的msg按msg排序按cnt desc;’sed的/[\t]/,/g'>table.csv 失败:ParseException第1:89行无法识别表达式规范中“like”“%”“password”附近的输入 我知道在指定字符串“%abcd%”时有问题。该命令在配置单元环境中工作正常,但这里我

  • 我在执行配置单元查询时遇到异常。我关注以下链接:http://www.thecloudavenue.com/2013/03/analysis-tweets-using-flume-hadoop-and.html 终端数据在这里: