【问题标题】:How to handle Money data type when writing to Parquet写入 Parquet 时如何处理 Money 数据类型
【发布时间】:2020-10-26 22:37:37
【问题描述】:

我一直在尝试从 sql server 获取数据、加载到数据框并写入 parquet(后来我将其加载到 BigQuery 或其他来源)。 我对money数据类型有一些问题,例如当sql server中的数据时:

100,000

但在写入 parquet 后,它会转换为:

100

(由于数据量大,无法下载到本地确认,不过可能write.parquet换钱为int,请指正)。

这是我的脚本的一部分:

df = spark.read.format("jdbc") \
    .option("url", "jdbc:sqlserver://{myIP}:1433;instanceName={myInstance};database={myDB};") \
    .option("dbtable", table_source) \
    .option("user", user_source) \
    .option("password", password_source) \
    .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
    .load()

df.write.parquet("gs://output/sample.parquet")

我应该为每列指定一个方案吗?还是有更好的方法?

【问题讨论】:

    标签: apache-spark pyspark parquet


    【解决方案1】:

    我相信这是因为 , 字符被视为小数点。你能确认SQL server中的数据类型是数字吗?

    如果 SQL server 中的类型是数字,那么您可以尝试手动删除 , 并在写入 parquet 之前强制转换为双精度或字符串。如果它不是数字,那么无论如何你都必须进行强制转换。

    【讨论】:

    • 没错,它被视为逗号(,)作为小数点(。),使数据一致的唯一方法是转换为字符串类型,但我不能用这个做一些像 SUM 或 AVG 这样的计算数据类型。转换为 double 或 float 会使逗号后面的一些 0 丢失,例如 100,0000 变为 100,但我想念的一件事是如何替换逗号 (,)?我正在使用 regexp_replace 替换 (,) 但我相信输出是相同的,但是当我尝试像这样替换小数点 (.) 时:df2 = df.withColumn('data', regexp_replace('data', '.', '-')) 数据框列中的输出变为:------(没有数)
    • 这是因为regexp_replace 中的第二个参数是".",它被认为是一个正则表达式并且意味着匹配所有。所以点亮用替换字符"-" 替换所有字符。你必须使用val df2 = df.withColumn('data', regexp_replace("data", ",", "."))
    • 感谢您的帮助,现在我知道为什么它会替换所有数据,已经将您的答案标记为已接受但抱歉我的代表不足以 +1 您的问题,我希望有人遇到同样的问题找到它并给它 +1 或者如果我有 15 个代表,我稍后再给 +1
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2022-01-20
    • 2017-04-06
    • 2018-05-07
    相关资源
    最近更新 更多