hi Kenta,

It seems like using ExtensionType would be a simple way to handle this
for the immediate purpose of implementing user-facing Array types. If
we wanted to change the the metadata representation to something more
"built-in" then we can keep discussing this. It seems like having a
distinct DataType subclass and Array subclass for unicode-but-not-UTF8
would be useful as opposed to adding an encoding attribute to
BinaryType. Interested to know what you think about this solution.

- Wes

On Mon, Sep 2, 2019 at 3:40 AM Kenta Murata <m...@mrkn.jp> wrote:
>
> [Abstract]
> When we have a string data encoded in a character encoding other than
> UTF-8, we must use a BinaryArray for the data.  But Apache Arrow
> doesn’t provide the way to specify what a character encoding used in a
> BinaryArray.  In this mail, I’d like to discuss how Apache Arrow
> provides the way to manage a character encoding in a BinaryArray.
>
> I’d appreciate any comments or suggestions.
>
> [Long description]
> Apache Arrow has the specialized type for UTF-8 encoded string but
> doesn’t have types for other character encodings, such as ISO-8859-x
> and Shift_JIS. We need to manage what a character encoding is used in
> a binary string array, in the outside of the arrays such as metadata.
>
> In Datasets project, one of the goals is to support database
> protocols.  Some databases support a lot of character encodings in
> each manner.  For example, PostgreSQL supports to specify what a
> character encoding is used for each database, and MySQL allows us to
> specify character encodings separately for each level: database,
> table, and column.
>
> I have a concern about how does Apache Arrow provide the way to
> specify character encodings for values in arrays.
>
> If people can constrain to use UTF-8 for all the string data,
> StringArray is enough for them. But if they cannot unify the character
> encoding of string data in UTF-8, should Apache Arrow provides the
> standard way of the character encoding management?
>
> The example use of Apache Arrow in such case is an application to the
> internal data of OR mapper library, such as ActiveRecord of Ruby on
> Rails.
>
> My opinion is that Apache Arrow must have the standard way in both its
> format and its API.  The reason is below:
>
> (1) Currently, when we use MySQL or PostgreSQL as the data source of
> record batch streams, we will lose the information of character
> encodings the original data have
>
> (2) We need to struggle to support character encoding treatment on
> each combination of systems if we don’t have a standard way of
> character encoding management, though this is not fit to Apache
> Arrow’s philosophy
>
> (3) We cannot support character encoding treatment in the level of
> language-binding if Apache Arrow doesn’t provide the standard APIs of
> character encoding management
>
> There are two options to manage a character encoding in a BinaryArray.
> The first way is introducing an optional character_encoding field in
> BinaryType.  The second way is using custom_metadata field to supply
> the character encoding name.
>
> If we use custom_metadata, we should decide the key for this
> information.  I guess “charset” is good candidates for the key because
> it is widely used for specifying what a character encoding is used.
> The value must be the name of a character encoding, such as “UTF-8”
> and “Windows-31J”.  It is better if we can decide canonical encoding
> names, but I guess it is hard work because many systems use the same
> name for the different encodings.  For example, “Shift_JIS” means
> either IANA’s Shift_JIS or Windows-31J, they use the same coding rule
> but the corresponding character sets are slightly different.  See the
> spreadsheet [1] for the correspondence of character encoding names
> between MySQL, PostgreSQL, Ruby, Python, IANA [3], and Encoding
> standard of WhatWG [4].
>
> If we introduce the new optional field for the information of a
> character encoding in BinaryType, I recommend let this new field be a
> string to keep the name of a character encoding.  But it is possible
> to make the field integer and let it keep the enum value.  I don’t
> know there is a good standard for the enum value of character
> encodings.  IANA manages MIBenum [2], though the registered character
> encodings [3] are not enough for our requirement, I think.
>
> I prefer the second way because the first way can supply the
> information of character encoding only to a Field, not a BinaryArray.
>
> [1] 
> https://docs.google.com/spreadsheets/d/1D0xlI5r2wJUV45aTY1q2TwqD__v7acmd8FOfr8xSOVQ/edit?usp=sharing
> [2] https://tools.ietf.org/html/rfc3808
> [3] https://www.iana.org/assignments/character-sets/character-sets.xhtml
> [4] https://encoding.spec.whatwg.org/
>
> --
> Kenta Murata

Reply via email to