ablog

不器用で落着きのない技術者のメモ

QuickSight で S3 のデータを参照しようとすると「マニフェストファイルを有効な JSON として解析することはできません。」と怒られる

事象

  • QuickSight で [新しい分析]-[新しいデータセット] で S3 のデータを参照しようとすると「マニフェストファイルを有効な JSON として解析することはできません。」と怒られる

f:id:yohei-a:20200704194043p:plain

原因

  • ファイルが BOM付き UTF8 になっていたため。
$ file test.json
test.json: UTF-8 Unicode (with BOM) text, with CRLF line terminators

解決策

  • BOM を削除して再試行するとエラーが解消した。
$ nkf -Lw test.json > test_utf8.json
$ file test_utf8.json
test_utf8.json: ASCII text, with CRLF line terminators

補足

  • CSV はBOM付きでも問題なく参照できた。

参考

マニフェストファイルが有効であることを確認することを強くお勧めします。Amazon QuickSight によりファイルを解析できない場合、"We can't parse the manifest file as a valid JSON" または "We can't connect to the S3 bucket" のようなエラーが表示されます。

マニフェストファイルを確認するには

  1. マニフェストファイルを開きます。これは、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) で行うことができます。マニフェストファイルに移動し、[Open] を選択します。
  2. マニフェストファイル内で指定されている URI または URL が、接続先のファイルを示していることを確認します。

;ファイルをアップロードするのではなく、マニフェストファイルへのリンクを使用する場合は、マニフェストファイルが正しく形成されていることを確認します。リンクには、.json という単語の後に追加のフレーズを含めるべきではありません。S3 コンソールの詳細で [リンク] の値を見ることで、S3 ファイルへの正しいリンクを得ることができます。

  1. https://jsonlint.com にあるような JSON バリデーターを使用して、マニフェストファイルの内容が有効であることを確認してください。
  2. バケットまたはファイルに対するアクセス権限を確認します。https://console.aws.amazon.com/s3/ で、Amazon S3 バケットに移動し、[アクセス権限] タブを選択して、適切なアクセス権限を追加します。アクセス権限のレベルが適切である (バケットに対するもの、またはファイルに対するもの) であることを確認します。
  • https:// ではなく s3:// プロトコルを使用している場合は、バケットを直接参照していることを確認します。たとえば、s3://s3-us-west-2.amazonaws.com/awsexamplebucket/myfile.csv ではなく s3://awsexamplebucket/myfile.csv を使用します。s3:// と s3-us-west-2.amazonaws.com を使用して Amazon S3 を二重に指定すると、エラーが発生します。マニフェストファイルと Amazon S3 への接続の詳細については、「Amazon S3マニフェストファイルでサポートされている形式」を参照してください。

さらに、Amazon S3 データセットが「Amazon S3 ファイルを使用したデータセットの作成」のステップに従って作成されたことを確認します。
Athena を使用して Amazon S3 に接続する場合、「Amazon Athena に接続できない」を参照してください。

Amazon S3 に接続できない - Amazon QuickSight

Amazon QuickSight で S3 のデータを可視化

Amazon QuickSight で S3 のデータを可視化してみた。

データの準備

$ brew install nkf
$ unzip csv_26kyouto.zip
$ nkf -Lw zenkoku.csv > zenkoku-utf8.csv
$ file zenkoku-utf8.csv
zenkoku-utf8.csv: UTF-8 Unicode text, with CRLF line terminators
e$ head -3 zenkoku-utf8.csv
"住所CD","都道府県CD","市区町村CD","町域CD","郵便番号","事業所フラグ","廃止フラグ","都道府県","都道府県カナ","市区町村","市区町村カナ","町域","町域カナ","町域補足","京都通り名","字丁目","字丁目カナ","補足","事業所名","事業所名カナ","事業所住所","新住所CD"
60000000,1,1101,11010000,"060-0000",0,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク",," ","(該当なし)",,,,,,,,
60850400,1,1101,11010000,"060-8504",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク",," ","(該当なし)",,,,,"富士通 株式会社 北海道支社","フジツウ カブシキガイシヤ ホツカイドウシシヤ","北2条西4丁目1番地札幌三井JPビルディング",
{ 
    "fileLocations": [                                                    
          {"URIPrefixes": 
              [
              "https://s3.amazonaws.com/quicksight-bucket/japan-address/zenkoku-utf8.csv",
              ]
          }
     ],
     "globalUploadSettings": {
       "format": "CSV",
       "textqualifier": "\"",
       "delimiter": ","
   }
}

f:id:yohei-a:20200704175245p:plain

QuickSight でアクセス権限付与

  • QuickSight で S3 バケットへのアクセス権限を許可する。
    • マネコンのQuickSightの右上の人アイコンから[バージニア北部]を選択。
    • マネコンのQuickSightの右上の人アイコンから[QuickSightの管理]を選択。
    • 左ペインで[セキュリティとアクセス権限]をクリック。
    • [接続された製品とサービス]の[追加または削除する]をクリック。
    • [Amazon S3] の [詳細]-[S3 バケットを選択する] をクリック。
    • 作成したS3バケットを選択する。

f:id:yohei-a:20200704180455p:plain

QuickSight で可視化

f:id:yohei-a:20200704182149p:plain

  • [データの編集/プレビュー]をクリック。

f:id:yohei-a:20200704182402p:plain

  • [保存して視覚化]をクリック。

f:id:yohei-a:20200704182152p:plain

  • グラフを作成する
    • ビジュアルタイプ: 水平積み上げ棒グラフ
    • Y軸: 都道府県
    • 値: 都道府県(カウント)

f:id:yohei-a:20200704183924p:plain

ダッシュボードを参照する

  • トップページからすべてのダッシュボードをクリック

f:id:yohei-a:20200704190152p:plain

  • Japan Address をクリック

f:id:yohei-a:20200704184615p:plain

Glue ジョブでのサイズの大きい gzip ファイルの解凍について

メモ

f:id:yohei-a:20200703075852p:plain
What could be the problem?
The first thing I looked at was whether the compression type for the data was the problem. GZip is a non splittable compression type, so it is likely the excess time is from uncompression of the data.


(中略)

f:id:yohei-a:20200703075848p:plain
A solution to our problem was to either uncompress gzip files using S3 event hooks, prior to them being processed with Glue, or to use smaller GZip files to get over these performance barriers.

The end solution was to use the small GZip files, as it had the least disruption on the existing process, and also meant that the transfer to S3 was quicker.

Fixing slow performance issues with AWS Glue ETL jobs | beardy.digital

Aurora Postgres->KDS->KFH->S3 に出力したログを復号して CSV に変換する Python スクリプト

  • Amazon Linux 2 にパッケージをインストール
sudo yum -y install gcc
sudo yum -y install python-devel
  • Python のモジュールをインストール
pip install boto3
pip install aws-encryption-sdk
pip install pycrypto
pip install dataclasses
pip install jq

pyspark.sql module の select で DataFrame に複数カラムを連結したカラムを追加する

pyspark.sql module の select、concat、col で DataFrame に複数カラムを連結したカラムを追加する。.alias("...") で連結したカラムに別名をつけている。

from pyspark.sql.functions import concat, col, lit
df = df.select(col("col1"), col("col2"), concat(col("col1"), lit("_"), col("col2")).alias("col3"))

pyspark.sql module の select で DataFrame の全カラムを取得する

pyspark.sql module の select で DataFrame の全カラムを取得する。

df = df.select([column for column in df.columns])

参考

drop_list = ['a column', 'another column', ...]
df.select([column for column in df.columns if column not in drop_list])

apache-spark — pysparkデータフレームの列を削除する方法

select(*cols)

  • Projects a set of expressions and returns a new DataFrame.
  • Parameters
    • cols – list of column names (string) or expressions (Column). If one of the column names is ‘*’, that column is expanded to include all columns in the current DataFrame.
>>> df.select('*').collect()
[Row(age=2, name='Alice'), Row(age=5, name='Bob')]
>>> df.select('name', 'age').collect()
[Row(name='Alice', age=2), Row(name='Bob', age=5)]
>>> df.select(df.name, (df.age + 10).alias('age')).collect()
[Row(name='Alice', age=12), Row(name='Bob', age=15)]

New in version 1.3.

pyspark.sql module — PySpark master documentation