CData Syncから Databricks に同期する際の Unsupported data type "BIT" エラーへの対応方法


:::note info
本記事の内容は以前のバージョンでの動作です。
最新バージョンにすることで同様のエラーが解消される可能性があります。
:::

## 概要

CData Sync にて Databricks へデータを同期する際に発生した下記エラーへの対応方法を共有します。このエラーは、 Databricks には存在しないデータ型である BIT 型であるところが原因です。対応方法としては、代替できるデータ型に変換する方法です。

> [0] Error running query: [UNSUPPORTED_DATATYPE] org.apache.spark.sql.catalyst.parser.ParseException: [UNSUPPORTED_DATATYPE] Unsupported data type "BIT". 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c3244d8b-ce06-3c49-6b2b-bed91abdb4d6.png)

本記事では下記の２つの方法を紹介します。

1. CData Sync のタスクを設定を変更する方法
1. Databricks にて事前にテーブルを作成する方法

下記が Databricks で設定できるデータ型ですが、BIT 型だけでなく、 UUID 型や DEFAULT 型も Databricks では存在しないため同様のエラーとなる可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/eda79244-4bd2-58ba-2f3b-6c9cf98a530a.png)


## エラーの再現方法

### 1. カラムが BIT 型になるようなタスクを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0ba24f1b-7a80-c9ca-b67f-c369856dfbe9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7d01e76c-65e2-e22d-04ef-82b2ea46f63c.png)

### 2. ジョブを実行しエラーとなることを確認

> [0] Error running query: [UNSUPPORTED_DATATYPE] org.apache.spark.sql.catalyst.parser.ParseException: [UNSUPPORTED_DATATYPE] Unsupported data type "BIT". 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ccfc6443-7bec-a156-72b8-fb818e12fc46.png)

## エラーの調査

### 1. Job History Logs タブの　Destination のログを取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f8d07e5a-c996-5a06-0b9a-bde8b4682a7d.png)

### 2. エラーメッセージの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1dd187ac-f550-af64-6e5a-e1fd0929f775.png)

### 3. エラーとなっている SQL を取得

```sql
CREATE TABLE `Account` (`Id` VARCHAR(18), `IsDeleted` BIT, `MasterRecordId` VARCHAR(18), `Name` VARCHAR(255), `Type` VARCHAR(255), `ParentId` VARCHAR(18), `BillingStreet` VARCHAR(255), `BillingCity` VARCHAR(40), `BillingState` VARCHAR(80), `BillingPostalCode` VARCHAR(20), `BillingCountry` VARCHAR(80), `BillingLatitude` DOUBLE, `BillingLongitude` DOUBLE, `BillingGeocodeAccuracy` VARCHAR(255), `ShippingStreet` VARCHAR(255), `ShippingCity` VARCHAR(40), `ShippingState` VARCHAR(80), `ShippingPostalCode` VARCHAR(20), `ShippingCountry` VARCHAR(80), `ShippingLatitude` DOUBLE, `ShippingLongitude` DOUBLE, `ShippingGeocodeAccuracy` VARCHAR(255), `Phone` VARCHAR(40), `Fax` VARCHAR(40), `AccountNumber` VARCHAR(40), `Website` VARCHAR(255), `PhotoUrl` VARCHAR(255), `Sic` VARCHAR(20), `Industry` VARCHAR(255), `AnnualRevenue` DECIMAL(38, 0), `NumberOfEmployees` INTEGER, `Ownership` VARCHAR(255), `TickerSymbol` VARCHAR(20), `Description` VARCHAR(32000), `Rating` VARCHAR(255), `Site` VARCHAR(80), `OwnerId` VARCHAR(18), `CreatedDate` TIMESTAMP, `CreatedById` VARCHAR(18), `LastModifiedDate` TIMESTAMP, `LastModifiedById` VARCHAR(18), `SystemModstamp` TIMESTAMP, `LastActivityDate` DATE, `LastViewedDate` TIMESTAMP, `LastReferencedDate` TIMESTAMP, `Jigsaw` VARCHAR(20), `JigsawCompanyId` VARCHAR(20), `CleanStatus` VARCHAR(255), `AccountSource` VARCHAR(255), `DunsNumber` VARCHAR(9), `Tradestyle` VARCHAR(255), `NaicsCode` VARCHAR(8), `NaicsDesc` VARCHAR(120), `YearStarted` VARCHAR(4), `SicDesc` VARCHAR(80), `DandbCompanyId` VARCHAR(18), `CustomerPriority__c` VARCHAR(255), `SLA__c` VARCHAR(255), `Active__c` VARCHAR(255), `NumberofLocations__c` DOUBLE, `UpsellOpportunity__c` VARCHAR(255), `SLASerialNumber__c` VARCHAR(10), `SLAExpirationDate__c` DATE, CONSTRAINT pk_7be251de_12f542d9 PRIMARY KEY(`Id`))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/410d06d7-46f1-1bcb-2748-94afeb99e68d.png)

### 4. Databricks 上で取得した SQL を実行してエラーとなることを確認

> [UNSUPPORTED_DATATYPE] Unsupported data type "BIT". SQLSTATE: 0A000 line 3, pos 14

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f3c6cc97-ebe0-47f9-ef78-9856cc10528c.png)

## エラーの対応方法

### 1. CData Sync のタスクを設定を変更する方法

#### 1-1. タスクの Columns タブを表示し、右側の`Edit Mapping`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2553243e-448f-8a68-f105-65ed3c93d41a.png)

#### 1-2. BIT 型のカラムを検索し、設定ボタン（`･･･`） -> `Edit Destination`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/676cfe40-535c-3c0c-58e9-dfba9bdedb82.png)

#### 1-3.  BIT 型から SMALLINT 型に変更して`Done`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/908c07ef-8b61-4afc-b497-ff67e700f286.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d5894053-b85e-724b-1e52-bc9b78899999.png)

#### 1-4. `Save Mapping`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1c6d6fc4-0d9b-c241-0d86-abb5d52c8b40.png)

#### 1-5. ジョブを実行して正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cb7c0ff9-6cae-86c4-6fb9-ddb744513c2f.png)

### 2. Databricks にて事前にテーブルを作成する方法

#### 2-1. Databricks にて書き込み先のテーブルを作成

```sql
%sql
USE CATALOG manabian_test;
USE manabian_test.cdata_sync;
```

```sql
%sql
CREATE OR REPLACE TABLE `Account` (
  `Id` VARCHAR(18),
  `IsDeleted` SMALLINT,
  `MasterRecordId` VARCHAR(18),
  `Name` VARCHAR(255),
  `Type` VARCHAR(255),
  `ParentId` VARCHAR(18),
  `BillingStreet` VARCHAR(255),
  `BillingCity` VARCHAR(40),
  `BillingState` VARCHAR(80),
  `BillingPostalCode` VARCHAR(20),
  `BillingCountry` VARCHAR(80),
  `BillingLatitude` DOUBLE,
  `BillingLongitude` DOUBLE,
  `BillingGeocodeAccuracy` VARCHAR(255),
  `ShippingStreet` VARCHAR(255),
  `ShippingCity` VARCHAR(40),
  `ShippingState` VARCHAR(80),
  `ShippingPostalCode` VARCHAR(20),
  `ShippingCountry` VARCHAR(80),
  `ShippingLatitude` DOUBLE,
  `ShippingLongitude` DOUBLE,
  `ShippingGeocodeAccuracy` VARCHAR(255),
  `Phone` VARCHAR(40),
  `Fax` VARCHAR(40),
  `AccountNumber` VARCHAR(40),
  `Website` VARCHAR(255),
  `PhotoUrl` VARCHAR(255),
  `Sic` VARCHAR(20),
  `Industry` VARCHAR(255),
  `AnnualRevenue` DECIMAL(38, 0),
  `NumberOfEmployees` INTEGER,
  `Ownership` VARCHAR(255),
  `TickerSymbol` VARCHAR(20),
  `Description` VARCHAR(32000),
  `Rating` VARCHAR(255),
  `Site` VARCHAR(80),
  `OwnerId` VARCHAR(18),
  `CreatedDate` TIMESTAMP,
  `CreatedById` VARCHAR(18),
  `LastModifiedDate` TIMESTAMP,
  `LastModifiedById` VARCHAR(18),
  `SystemModstamp` TIMESTAMP,
  `LastActivityDate` DATE,
  `LastViewedDate` TIMESTAMP,
  `LastReferencedDate` TIMESTAMP,
  `Jigsaw` VARCHAR(20),
  `JigsawCompanyId` VARCHAR(20),
  `CleanStatus` VARCHAR(255),
  `AccountSource` VARCHAR(255),
  `DunsNumber` VARCHAR(9),
  `Tradestyle` VARCHAR(255),
  `NaicsCode` VARCHAR(8),
  `NaicsDesc` VARCHAR(120),
  `YearStarted` VARCHAR(4),
  `SicDesc` VARCHAR(80),
  `DandbCompanyId` VARCHAR(18),
  `CustomerPriority__c` VARCHAR(255),
  `SLA__c` VARCHAR(255),
  `Active__c` VARCHAR(255),
  `NumberofLocations__c` DOUBLE,
  `UpsellOpportunity__c` VARCHAR(255),
  `SLASerialNumber__c` VARCHAR(10),
  `SLAExpirationDate__c` DATE,
  CONSTRAINT pk_7be251de_12f542d9 PRIMARY KEY(`Id`)
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9cb316bc-3186-9587-a582-07211c7eeff5.png)

#### 2-2. ジョブを実行して正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bce7d4f1-bec7-dc28-3549-03d1e046e732.png)