From 3f3f070419ab1a9f9a86f2cc0f39ce07aaf92673 Mon Sep 17 00:00:00 2001 From: Ivan G Date: Fri, 5 Mar 2021 17:41:24 +0000 Subject: [PATCH] docs update: remove unsupported parq util --- README.md | 6 +- doc/img/parq-schema.png | Bin 29113 -> 0 bytes doc/parq.md | 132 ---------------------------------------- 3 files changed, 4 insertions(+), 134 deletions(-) delete mode 100644 doc/img/parq-schema.png delete mode 100644 doc/parq.md diff --git a/README.md b/README.md index 94338abd..3f8d90cb 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,14 @@ **Fully managed** .NET library to read and write [Apache Parquet](https://parquet.apache.org/) files. Supports: -- `.NET 4.5` and up. +- `.NET 5.0` - `.NET Standard 1.4` and up (for those who are in a tank that means it supports `.NET Core` (all versions) implicitly) +- `.NET 4.6.1` and up via `.NET Standard 1.4` Runs on all flavors of Windows, Linux, MacOSX, mobile devices (iOS, Android) via [Xamarin](https://www.xamarin.com/), [gaming consoles](doc/xboxone.md) or anywhere .NET Standard runs which is a lot! +Support for Tizen and Web Assembly is coming. + > Performs integration tests with **parquet-mr** (original Java parquet implementation) to test for identical behavior. We are planning to add more third-party platforms integration as well. ## Why @@ -49,7 +52,6 @@ All the parties in this test were given 10 iteration and time was taken as an av - [Fast Automatic Serialisation](doc/serialisation.md) - [Declaring Schema](doc/schema.md) - [Supported Types](doc/types.md) -- **[parq!!!](doc/parq.md)** - [Sponsorship](#sponsorship) You can track the [amount of features we have implemented so far](doc/features.md). diff --git a/doc/img/parq-schema.png b/doc/img/parq-schema.png deleted file mode 100644 index b0052a48e705a5e883cebaf6758bf669d752f09c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29113 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 diff --git a/doc/parq.md b/doc/parq.md deleted file mode 100644 index 88eb94fb..00000000 --- a/doc/parq.md +++ /dev/null @@ -1,132 +0,0 @@ -# PARQ (Global Tool) - -Since v3.1 parquet repository includes an amazing [.NET Core Global Tool](https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools) called **parq** which serves as a first class command-line client to perform various funtions on parquet files. - -## Installing - -Installing is super easy with *global tools*, just go to the terminal and type `dotnet tool install -g parq` and it's done. Note that you need to have at least **.NET Core 2.1 SDK** isntalled on your machine, which you probably have as a hero .NET developer. - -## Commands - -### Viewing Schema - -To view schema type - -```powershell -parq schema -```` - -which produces an output similar to: - -![Parq Schema](img/parq-schema.png) - -### Converting to JSON - -```powershell -parq convert -``` - -converts to multiline json, for instance: - - -```powershell -parq convert all_var1.parquet - -{"addresses": [{"line1": "Dante Road", "name": "Head Office", "openingHours": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "postcode": "SE11"}, {"line1": "Somewhere Else", "name": "Small Office", "openingHours": [6, 7, 19, 20, 21, 22, 23], "postcode": "TN19"}], "cities": ["London", "Derby"], "comment": "this file contains all the permunations for nested structures and arrays to test Parquet parser", "id": 1, "location": {"latitude": 51.2, "longitude": 66.3}, "price": {"lunch": {"max": 2, "min": 1}}} -{"addresses": [{"line1": "Dante Road", "name": "Head Office", "openingHours": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "postcode": "SE11"}, {"line1": "Somewhere Else", "name": "Small Office", "openingHours": [6, 7, 19, 20, 21, 22, 23], "postcode": "TN19"}], "cities": ["London", "Derby"], "comment": "this file contains all the permunations for nested structures and arrays to test Parquet parser", "id": 1, "location": {"latitude": 51.2, "longitude": 66.3}, "price": {"lunch": {"max": 2, "min": 1}}} -``` - -By default **parq** displays the first 10 rows of the source file, however you can override it with `--max-rows` option. - -## Converting to CSV - -```powershell -parq convert -f csv -``` - -converts to CSV, for instance: - -``` -c_custkey,c_name,c_address,c_nationkey,c_phone,c_acctbal,c_mktsegment,c_comment -1,Customer#000000001,IVhzIApeRb ot,c,E,15,25-989-741-2988,711.56,BUILDING,to the even, regular platelets. regular, ironic epitaphs nag e -2,Customer#000000002,XSTf4,NCwDVaWNe6tEgvwfmRchLXak,13,23-768-687-3665,121.65,AUTOMOBILE,l accounts. blithely ironic theodolites integrate boldly: caref -3,Customer#000000003,MG9kdTD2WBHm,1,11-719-748-3364,7498.12,AUTOMOBILE, deposits eat slyly ironic, even instructions. express foxes detect slyly. blithely even accounts abov -4,Customer#000000004,XxVSJsLAGtn,4,14-128-190-5944,2866.83,MACHINERY, requests. final, regular ideas sleep final accou 5,Customer#000000005,KvpyuHCplrB84WgAiGV6sYpZq7Tj,3,13-750-942-6364,794.47,HOUSEHOLD,n accounts will have to unwind. foxes cajole accor -``` - -Note that CSV conversion is not intended to be used with complex data types and is best to be used with flat tables only. - -By default **parq** displays the first 10 rows of the source file, however you can override it with `--max-rows` option. - -### Viewing Internal Metadata - -Internal metadata is grabbed from parquet file internals and describes pretty much everything we know about the file. This metadata is not by default exposed from Parquet.Net API as it's hard to work with from the user perspective, however it can be extremely useful for performance tuning and general understanding how a particular file is structured. - -To view this metadata, type - -```powershell -parq meta -```` - -sample output: - -```bash -parq meta stats_test.parquet -``` - -``` -parq v1.0.0 - -File Metadata -Created By parquet-mr version 1.8.3 (build aef7230e114214b7cc962a8f3fc5aeed6ce80828) -Total Rows 2 -Version 1 - -Key-Value Metadata -org.apache.spark.sql.parquet.row.metadata {"type":"struct","fields":[{"name":"isbn","type":"string","nullable":true,"metadata":{}},{"name":"author","type":"string","nullable":true,"metadata":{}}]} - -Row Groups - - Row Group #0 - Total Rows 2 - Total Byte Size 162 (0.16 KiB) - - Column #0 - File Offset 4 - File Path - Codec UNCOMPRESSED - Data Page Offset 4 - Dictionary Page Offset 0 - Index Page Offset 0 - Encodings RLE, PLAIN, BIT_PACKED - Total Values 2 - Path in Schema isbn - Compressed Size 67 (0.07 KiB) - Uncompressed Size 67 (0.07 KiB) - Type BYTE_ARRAY - Statistics - Null Count 0 - Distinct Count undefined - Min 12345-6 - Max 12345-7 - - Column #1 - File Offset 71 - File Path - Codec UNCOMPRESSED - Data Page Offset 71 - Dictionary Page Offset 0 - Index Page Offset 0 - Encodings RLE, PLAIN, BIT_PACKED - Total Values 2 - Path in Schema author - Compressed Size 95 (0.09 KiB) - Uncompressed Size 95 (0.09 KiB) - Type BYTE_ARRAY - Statistics - Null Count 0 - Distinct Count undefined - Min Ivan Gavryliuk - Max Richard Conway - -``` \ No newline at end of file