You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ee...@apache.org on 2009/10/15 21:02:48 UTC
svn commit: r825618 - in /incubator/cassandra/trunk: bin/sstable2json
src/java/org/apache/cassandra/tools/SSTableExport.java
Author: eevans
Date: Thu Oct 15 19:02:47 2009
New Revision: 825618
URL: http://svn.apache.org/viewvc?rev=825618&view=rev
Log:
basic json exporter for sstables
Added:
incubator/cassandra/trunk/bin/sstable2json (with props)
incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableExport.java (with props)
Added: incubator/cassandra/trunk/bin/sstable2json
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/bin/sstable2json?rev=825618&view=auto
==============================================================================
--- incubator/cassandra/trunk/bin/sstable2json (added)
+++ incubator/cassandra/trunk/bin/sstable2json Thu Oct 15 19:02:47 2009
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+if [ "x$CASSANDRA_INCLUDE" = "x" ]; then
+ for include in /usr/share/cassandra/cassandra.in.sh \
+ /usr/local/share/cassandra/cassandra.in.sh \
+ /opt/cassandra/cassandra.in.sh \
+ ~/.cassandra.in.sh \
+ `dirname $0`/cassandra.in.sh; do
+ if [ -r $include ]; then
+ . $include
+ break
+ fi
+ done
+elif [ -r $CASSANDRA_INCLUDE ]; then
+ . $CASSANDRA_INCLUDE
+fi
+
+if [ -z $CLASSPATH ]; then
+ echo "You must set the CLASSPATH var" >&2
+ exit 1
+fi
+
+java -cp $CLASSPATH -Dstorage-config=$CASSANDRA_CONF \
+ org.apache.cassandra.tools.SSTableExport "$@"
+
+# vi:ai sw=4 ts=4 tw=0 et
Propchange: incubator/cassandra/trunk/bin/sstable2json
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableExport.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableExport.java?rev=825618&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableExport.java (added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableExport.java Thu Oct 15 19:02:47 2009
@@ -0,0 +1,224 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.tools;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.db.IColumn;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.io.IteratingRow;
+import org.apache.cassandra.io.SSTableReader;
+import org.apache.cassandra.io.SSTableScanner;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.cli.PosixParser;
+
+/**
+ * Export SSTables to JSON format.
+ */
+public class SSTableExport
+{
+ private static final String OUTFILE_OPTION = "f";
+ private static Options options;
+ private static CommandLine cmd;
+
+ static
+ {
+ options = new Options();
+ Option optOutfile = new Option(OUTFILE_OPTION, true, "output file");
+ optOutfile.setRequired(false);
+ options.addOption(optOutfile);
+ }
+
+ private static String quote(String val)
+ {
+ return String.format("\"%s\"", val);
+ }
+
+ private static String asKey(String val)
+ {
+ return String.format("%s: ", quote(val));
+ }
+
+ private static String serializeColumns(Collection<IColumn> cols, AbstractType comp)
+ {
+ StringBuilder json = new StringBuilder("{");
+
+ Iterator<IColumn> iter = cols.iterator();
+ while (iter.hasNext())
+ {
+ IColumn column = iter.next();
+ json.append(asKey(comp.getString(column.name())));
+ json.append(quote(FBUtilities.bytesToHex(column.value())));
+ if (iter.hasNext())
+ json.append(", ");
+ }
+
+ json.append(" }");
+
+ return json.toString();
+ }
+
+ private static String serializeRow(IteratingRow row) throws IOException
+ {
+ ColumnFamily cf = row.getColumnFamily();
+ AbstractType comparator = cf.getComparator();
+ StringBuilder json = new StringBuilder(asKey(row.getKey().key));
+
+ if (cf.isSuper())
+ {
+ json.append("{ ");
+
+ Iterator<IColumn> iter = cf.getSortedColumns().iterator();
+ while (iter.hasNext())
+ {
+ IColumn column = iter.next();
+ json.append(asKey(comparator.getString(column.name())));
+ json.append(serializeColumns(column.getSubColumns(), comparator));
+ if (iter.hasNext())
+ json.append(", ");
+ }
+
+ json.append(" }");
+ }
+ else
+ {
+ json.append(serializeColumns(cf.getSortedColumns(), comparator));
+ }
+
+ return json.toString();
+ }
+
+ /**
+ * Export an SSTable and write the resulting JSON to a PrintStream.
+ *
+ * @param ssTableFile the SSTable to export
+ * @param outs PrintStream to write the output to
+ * @throws IOException on failure to read/write input/output
+ */
+ public static void export(String ssTableFile, PrintStream outs) throws IOException
+ {
+ SSTableReader reader = SSTableReader.open(ssTableFile);
+ SSTableScanner scanner = reader.getScanner();
+
+ outs.println("{");
+
+ while(scanner.hasNext())
+ {
+ IteratingRow row = scanner.next();
+ try
+ {
+ String jsonOut = serializeRow(row);
+ outs.print(" " + jsonOut);
+ if (scanner.hasNext())
+ outs.println(",");
+ else
+ outs.println();
+ }
+ catch (IOException ioexcep)
+ {
+ System.err.println("WARNING: Corrupt row " + row.getKey().key + " (skipping).");
+ continue;
+ }
+ catch (OutOfMemoryError oom)
+ {
+ System.err.println("ERROR: Out of memory deserializing row " + row.getKey().key);
+ continue;
+ }
+ }
+
+ outs.println("}");
+ outs.flush();
+ }
+
+ /**
+ * Export an SSTable and write the resulting JSON to a file.
+ *
+ * @param ssTableFile SSTable to export
+ * @param outFile file to write output to
+ * @throws IOException on failure to read/write SSTable/output file
+ */
+ public static void export(String ssTableFile, String outFile) throws IOException
+ {
+ PrintStream outs = new PrintStream(outFile);
+ export(ssTableFile, outs);
+ }
+
+ /**
+ * Export an SSTable and write the resulting JSON to standard out.
+ *
+ * @param ssTableFile SSTable to export
+ * @throws IOException on failure to read/write SSTable/standard out
+ */
+ public static void export(String ssTableFile) throws IOException
+ {
+ export(ssTableFile, System.out);
+ }
+
+ /**
+ * Given arguments specifying an SSTable, and optionally an output file,
+ * export the contents of the SSTable to JSON.
+ *
+ * @param args command lines arguments
+ * @throws IOException on failure to open/read/write files or output streams
+ */
+ public static void main(String[] args) throws IOException
+ {
+ String usage = String.format("Usage: %s [-f outfile] <sstable>%n", SSTableExport.class.getName());
+
+ CommandLineParser parser = new PosixParser();
+ try
+ {
+ cmd = parser.parse(options, args);
+ } catch (ParseException e1)
+ {
+ System.err.println(e1.getMessage());
+ System.err.println(usage);
+ System.exit(1);
+ }
+
+ String outFile = cmd.getOptionValue(OUTFILE_OPTION);
+
+ if (cmd.getArgs().length != 1)
+ {
+ System.err.println("You must supply exactly one sstable");
+ System.err.println(usage);
+ System.exit(1);
+ }
+
+ if (outFile != null)
+ {
+ export(cmd.getArgs()[0], outFile);
+ }
+ else
+ {
+ export(cmd.getArgs()[0]);
+ }
+ System.exit(0);
+ }
+}
\ No newline at end of file
Propchange: incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/SSTableExport.java
------------------------------------------------------------------------------
svn:eol-style = native