[Д2] 1. Разделить URL-адрес на структурные части. Для этого используйте java.net.URL
.
2. Кодируйте каждую структурную часть правильно!
3. Использовать IDN.toASCII(putDomainNameHere)
- Punycode кодировать имя хоста!
4. Используйте java.net.URI.toASCIIString()
для процентного кодирования, кодированного в кодировке NFC unicode - (лучше было бы NFKC!). Для получения дополнительной информации см.: Как правильно закодировать этот URL
URL url= new URL("http://example.com/query?q=random word £500 bank $");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String correctEncodedURL=uri.toASCIIString();
System.out.println(correctEncodedURL);
Печать
http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$
Если вас не интересуют ограниченные и уродливые обходные пути , такие как Encoders.kryo
:
import org.apache.spark.sql.Encoders
case class FooBar(foo: Int, bar: Any)
spark.createDataset(
sc.parallelize(Seq(FooBar(1, "a")))
)(Encoders.kryo[FooBar])
или
spark.createDataset(
sc.parallelize(Seq(FooBar(1, "a"))).map(x => (x.foo, x.bar))
)(Encoders.tuple(Encoders.scalaInt, Encoders.kryo[Any]))
, вы не , Все поля / столбцы в Dataset
должны быть известны, однородным типом, для которого в области видимости подразумевается неявное Encoder
. Здесь нет места для Any
.
API UDT обеспечивает немного большую гибкость и допускает ограниченный полиморфизм, но он является частным, не полностью совместимым с API Dataset
и обладает значительной производительностью и
Если для данного исполнения все значения одного и того же типа, вы можете, конечно, создавать специализированные классы и принимать решение, которое использовать во время выполнения.