GC Dataflowを初めて使用しましたが、ここで関連する回答が見つかりませんでした。もし私がこれをすでに見つけたなら、謝罪してください。Google Cloud Dataflow、BigQueryIO、TableRow.getのNullPointerException
私はv2.0 SDKを使用して単純なパイプラインを作成しようとしていますが、BigQueryIOを使用してPCollectionにデータを読み込む際に問題があります。 .withQueryメソッドを使用していて、BigQueryインターフェイスでクエリをテストしたところ、正常に動作しているようです。最初のPCollectionは問題なく作成されたようですが、セットアップで単純なParDo関数を使ってTableRowの値をPCollectionに変換すると、TableRowオブジェクトの.getを実行するコード行でNullPointerExceptionが発生します。
ここに私のコードです。 (私はおそらく、単純な何かが欠けている。私は、パイプラインのプログラミングでの総初心者です。任意の入力が最もいただければ幸いです。)
public class ClientAutocompletePipeline {
private static final Logger LOG = LoggerFactory.getLogger(ClientAutocompletePipeline.class);
public static void main(String[] args) {
// create the pipeline
Pipeline p = Pipeline.create(
PipelineOptionsFactory.fromArgs(args).withValidation().create());
// A step to read in the product names from a BigQuery table
p.apply(BigQueryIO.read().fromQuery("SELECT name FROM [beaming-team-169321:Products.raw_product_data]"))
.apply("ExtractProductNames", ParDo.of(new DoFn<TableRow, String>() {
@ProcessElement
public void processElement(ProcessContext c) {
// Grab a row from the BigQuery Results
TableRow row = c.element();
// Get the value of the "name" column from the table row.
//NOTE: This is the line that is giving me the NullPointerException
String productName = row.get("name").toString();
// Make sure it isn't empty
if (!productName.isEmpty()) {
c.output(productName);
}
}
}))
問い合わせは間違いBigQueryのUIで動作し、「名前」という列がありますクエリをテストするときに返されます。この行にNullPointerExceptionが表示されるのはなぜですか:
String productName = row.get("name").toString();
アイデアはありますか?
'name'列のすべての値がヌルでないことが保証されていますか? –
BigQueryでSELECT name FROM [beaming-team-169321:Products.raw_product_data] nameを実行すると、null値があることがわかります。したがって、パイプラインでこれを考慮する必要があります。 –
さて、今言えば、それは完璧な意味合いがあります。私は自分のコードに何らかのエラーがあったために何かがnullになるという誤った印象の下にあったと思うが、それはそうではないかもしれないと思う。返信ありがとう! – MrSimmonsSr