gpt4 book ai didi

xml - XSLT 新行插入不能按预期与 Hive 一起工作

转载 作者:可可西里 更新时间:2023-11-01 14:53:55 27 4
gpt4 key购买 nike

我正在使用 xslt 将 xml 转换为 csv,这是我的 xsl 文件:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cov="http://schemas.atlassian.com/clover3/report">
<xsl:output method="text"/>

<xsl:template match="testcase">
<xsl:value-of select ="@classname"/>
<xsl:text>,</xsl:text>
<xsl:value-of select ="@name"/>
<xsl:text>,</xsl:text>
<xsl:value-of select ="@time"/>
<xsl:text>&#xD;</xsl:text>
</xsl:template>

</xsl:stylesheet>

csv 文件看起来不错,所有新行都在那里,但是当我尝试使用以下查询使用 Hive(来自 Cloudera Hadoop)创建外部表时:

Create external table csv_test(className STRING, testName STRING, duration DOUBLE)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/TEST/';

对于我的 csv 文件中的每一行,我有两行,一行包含值,另一行包含 NULL。好像它没有正确地进行换行,并认为它是两条线而不是一条线。

我为新行尝试了不同的技巧,例如 , , , \n,前面代码的组合,甚至将标签放在两个单独的行上,但我得到了相同的结果。

另一个问题是第三个字段,持续时间。我总是有一个 NULL 值。在我的创建表查询中,如果我将 DOUBLE 替换为 STRING,它会起作用。

如果我使用相同的数据手动创建我的 cvs 文件,一切(换行和 double )都可以正常工作,如果仅使用 xslt 创建的 csv 文件就会出现问题。

我做错了什么吗?

最佳答案

不同系统和程序之间的换行符处理可能很棘手。您应该检查以下内容以确定哪里出了问题:

  • 当处理器读取 XML 时,其换行符全部转换为 0x0A,即 Windows 换行符 (0x0D + 0x0A) 转换为 0x0A,任何剩余的单个 0x0D(Mac 换行符)然后由 0x0A 替换。
  • 如果您没有显式使用 xsl:stripspace 或删除具有匹配模式的空文本节点,则默认匹配模式将输出空白。在上面的示例中,输入 XML 的换行符将成为输出 XML 的一部分。
  • 即使实际存在双换行符,许多文本编辑器也会在显示它们之前对其进行规范化。例如,在您的示例中,如果输入包含换行符,则输出可能包含 0xA + 0xD 的序列,如果在 Windows 中查看,看起来就像单个换行符,但可能不会被解释为单个其他系统上的换行符。
  • 在转换中一切都正确后,这取决于您如何将输出移动到最终位置。如果你使用 FTP,或者 Github,可以转换换行符。您可以通过将它们显式移动为二进制文件来解决此问题。
  • 某些 XSLT 1.0 处理器会在您使用 method="text" 输出时规范化行尾,以匹配您所在平台的默认行尾(这是不正确的行为,不过那是另一回事了)。您没有提及您使用的处理器,但您可以通过以二进制形式打开生成的文件并验证您只有 0xA 行结尾来检查这一点。
  • 通常,最安全的方法是对所有系统坚持相同的行尾制度,并防止在文件从一个系统上传到另一个系统时发生隐式转换。
  • 更新,显然是 Hive currently automatically normalizes line-endings,这意味着您要么遇到了 Hive 的错误,要么使用了不稳定的 Hive 构建,要么输出包含导致空记录出现的实际内容.对于后者,我们需要您当前用于尝试重现问题的最小但功能齐全的输入 XML 和 XSLT。

DOUBLE 字段的问题很棘手。它可能取决于本地化设置,但我对 Hive 的了解还不足以证明这一点。假设您的本地化是德语, double 值写为 23.456,98,在英语语言环境中为 23,456.98。检查 CSV 的格式以及它是否与预期输出匹配,或者将点转换为逗号或相反。

从输入中删除任何空格的 XSLT 示例如下所示(其他可能的选项):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cov="http://schemas.atlassian.com/clover3/report">

<xsl:output method="text"/>

<xsl:template match="testcase">
<xsl:value-of select ="@classname"/>
<xsl:text>,</xsl:text>
<xsl:value-of select ="@name"/>
<xsl:text>,</xsl:text>
<xsl:value-of select ="@time"/>
<xsl:text>&#xD;</xsl:text>
</xsl:template>

<!-- remove unmatched text nodes -->
<xsl:template match="text()" />

</xsl:stylesheet>

关于xml - XSLT 新行插入不能按预期与 Hive 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088575/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com