与Dask / Pandas和Pyspark的实木复合地板兼容

时间:2020-01-28 12:00:42

标签: python apache-spark dask parquet pyarrow

这是与here相同的问题,但是被接受的答案对我不起作用。

尝试: 我尝试以拼花格式保存一个简单的数据框,并用spark读取它。

问题:pyspark无法解释时间戳列

我做了什么

我尝试使用以下方式在hfds中将Dask数据帧保存为实木复合地板

double

然后我用pyspark读取文件:

  var doubles = samples
    .SampleValues       
    .Where(pair => (pair.Value != null) && !(pair.Value is string)) // not string value
    .Select(pair => new {
       Name  = samples.Name,
       Value = Convert.ToDouble(pair.Value), // which we convert to double
     });

  var strings = samples
    .SampleValues       
    .Where(pair => pair.Value is string)
    .Select(pair => new {
       Name  = samples.Name,
       Value = Convert.ToString(pair.Value),
     });

但是如果我将数据框保存为

import dask.dataframe as dd
dd.to_parquet(ddf_param_logs, 'hdfs:///user/<myuser>/<filename>', engine='pyarrow', flavor='spark')

utc时间戳列包含unix格式的时间戳信息(1578642290403000)

这是我的环境:

sdf = spark.read.parquet('hdfs:///user/<myuser>/<filename>')
sdf.show()

>>>  org.apache.spark.sql.execution.QueryExecutionException: Parquet column cannot be converted in file hdfs://nameservice1/user/<user>/<filename>/part.0.parquet. Column: [utc_timestamp], Expected: bigint, Found: INT96

1 个答案:

答案 0 :(得分:3)

明确包括了INT96类型,以允许与spark兼容,后者选择不使用镶木地板规范定义的标准时间类型。不幸的是,似乎它们又改变了,不再使用他们自己的以前的标准,而不是镶木地板。

如果您可以在这里找到spark想要的类型,然后将问题发布到dask仓库中,将不胜感激。您可能希望从包含时间列的spark输出数据,并查看其最终格式为。

您还尝试过fastparquet后端吗?