blob: 9bd69dfa72b4c0a7e46ab031f9d45859add62f29 [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
use datafusion::prelude::{ParquetReadOptions, SessionContext};
use datafusion_common::test_util::batches_to_string;
use datafusion_common::{test_util::parquet_test_data, Result};
use insta::assert_snapshot;
#[tokio::test]
async fn describe() -> Result<()> {
let ctx = parquet_context().await;
let describe_record_batch = ctx
.table("alltypes_tiny_pages")
.await?
.describe()
.await?
.collect()
.await?;
assert_snapshot!(
batches_to_string(&describe_record_batch),
@r"
+------------+-------------------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+-----------------+------------+-------------------------+--------------------+-------------------+
| describe | id | bool_col | tinyint_col | smallint_col | int_col | bigint_col | float_col | double_col | date_string_col | string_col | timestamp_col | year | month |
+------------+-------------------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+-----------------+------------+-------------------------+--------------------+-------------------+
| count | 7300.0 | 7300 | 7300.0 | 7300.0 | 7300.0 | 7300.0 | 7300.0 | 7300.0 | 7300 | 7300 | 7300 | 7300.0 | 7300.0 |
| null_count | 0.0 | 0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0 | 0 | 0 | 0.0 | 0.0 |
| mean | 3649.5 | null | 4.5 | 4.5 | 4.5 | 45.0 | 4.949999964237213 | 45.45 | null | null | null | 2009.5 | 6.526027397260274 |
| std | 2107.472815166704 | null | 2.8724780750809518 | 2.8724780750809518 | 2.8724780750809518 | 28.724780750809533 | 3.1597258182544645 | 29.012028558317645 | null | null | null | 0.5000342500942125 | 3.44808750051728 |
| min | 0.0 | null | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 01/01/09 | 0 | 2008-12-31T23:00:00 | 2009.0 | 1.0 |
| max | 7299.0 | null | 9.0 | 9.0 | 9.0 | 90.0 | 9.899999618530273 | 90.89999999999999 | 12/31/10 | 9 | 2010-12-31T04:09:13.860 | 2010.0 | 12.0 |
| median | 3649.0 | null | 4.0 | 4.0 | 4.0 | 45.0 | 4.949999809265137 | 45.45 | null | null | null | 2009.0 | 7.0 |
+------------+-------------------+----------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+-----------------+------------+-------------------------+--------------------+-------------------+
");
Ok(())
}
#[tokio::test]
async fn describe_boolean_binary() -> Result<()> {
let ctx = parquet_context().await;
//add test case for only boolean boolean/binary column
let result = ctx
.sql("select 'a' as a,true as b")
.await?
.describe()
.await?
.collect()
.await?;
assert_snapshot!(
batches_to_string(&result),
@r"
+------------+------+------+
| describe | a | b |
+------------+------+------+
| count | 1 | 1 |
| null_count | 0 | 0 |
| mean | null | null |
| std | null | null |
| min | a | null |
| max | a | null |
| median | null | null |
+------------+------+------+
");
Ok(())
}
#[tokio::test]
async fn describe_null() -> Result<()> {
let ctx = parquet_context().await;
//add test case for only boolean boolean/binary column
let result = ctx
.sql("select 'a' as a, null as b")
.await?
.describe()
.await?
.collect()
.await?;
assert_snapshot!(
batches_to_string(&result),
@r"
+------------+------+------+
| describe | a | b |
+------------+------+------+
| count | 1 | 0 |
| null_count | 0 | 1 |
| mean | null | null |
| std | null | null |
| min | a | null |
| max | a | null |
| median | null | null |
+------------+------+------+
");
Ok(())
}
/// Return a SessionContext with parquet file registered
async fn parquet_context() -> SessionContext {
let ctx = SessionContext::new();
let testdata = parquet_test_data();
ctx.register_parquet(
"alltypes_tiny_pages",
&format!("{testdata}/alltypes_tiny_pages.parquet"),
ParquetReadOptions::default(),
)
.await
.unwrap();
ctx
}